http://www.lightoj.com/volume_showproblem.php?problem=1044
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define N 1005 6 struct op{ 7 int a,b,len; 8 }mes[N*N]; 9 int dp[N],ct,n; 10 char s[N]; 11 bool map[N][N]; 12 void init() 13 { 14 memset(map,0,sizeof(map)); 15 n=strlen(s+1); 16 for(int i=1;i<=n;i++){ 17 map[i][i]=1; 18 mes[++ct].a=i; 19 mes[ct].b=i; 20 mes[ct].len=1; 21 } 22 if(n>1){ 23 for(int i=1;i<n;i++) 24 if(s[i]==s[i+1]){ 25 map[i][i+1]=1; 26 mes[++ct].a=i; 27 mes[ct].b=i+1; 28 mes[ct].len=2; 29 } 30 } 31 for(int len=3;len<=n;len++) 32 for(int i=1;i<=n-len+1;i++) 33 if(s[i]==s[i+len-1]&&map[i+1][i+len-2]){ 34 map[i][i+len-1]=1; 35 mes[++ct].a=i; 36 mes[ct].b=i+len-1; 37 mes[ct].len=len; 38 } 39 } 40 bool cmp(struct op aa,struct op bb) 41 { 42 return aa.b<bb.b; 43 } 44 int main() 45 { 46 int t,cas=1; 47 scanf("%d",&t); 48 while(t--){ 49 ct=0; 50 scanf("%s",s+1); 51 init(); 52 sort(mes+1,mes+ct+1,cmp); 53 memset(dp,0x3f3f3f,sizeof(dp)); 54 dp[0]=0; 55 for(int i=1;i<=ct;i++) 56 dp[mes[i].b]=min(dp[mes[i].b],dp[mes[i].b-mes[i].len]+1); 57 printf("Case %d: %d\n",cas++,dp[n]); 58 } 59 return 0; 60 }