uva 11584

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
#include<cmath>
#include<queue>
#include<cctype>
#include<set>
#include<unordered_set>
using namespace std;

const int maxn = 1000 + 5;
int dp[maxn];
int S[maxn][maxn];

int main() {
   int N;
   cin>>N;
   for(int k = 0; k < N; k++){
      string s;
      cin>>s;
      int n = s.length();
      fill(S[0],S[0]+maxn*maxn,0);
      fill(dp,dp+maxn,maxn);
      for(int i = 0; i < n; i++)
         for(int j = i; j < n; j++){
            bool ok = true;
            int ii = i, jj = j;
            while(ii<jj){
                if(s[ii++] != s[jj--]){
                    ok = false;
                    break;
                }
            }
            if(ok) S[i][j] = 1;
         }

      dp[0] = 1;
      for(int i = 1; i < n; i++)
         for(int j = 0; j <= i; j++)
            if(S[j][i]){
                if(!j) dp[i] = 1;
                else dp[i] = min(dp[i],dp[j-1]+1);
            }

     cout<<dp[n-1]<<endl;

   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/80007896