现在在poj上做题,总是要看解题报告,特别是自己没做过的类型,实在是受不了,只能说自己做的题太少了,还不能熟练,这个也是区间dp,这几道区间dp都要求输出最后的结果,必须进行记录,确实麻烦很多
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 110 5 #define inf 0x7fffffff 6 using namespace std; 7 char str[N]; 8 struct node 9 { 10 int num; 11 char s[N]; 12 }dp[N][N]; 13 int pos; 14 char ts[N]; 15 void Int2S(int num) 16 { 17 int i,j; 18 pos=-1; 19 char cc; 20 while(num) 21 { 22 ts[++pos]=(num%10)+'0'; 23 num/=10; 24 } 25 for(j=0;j<=pos/2;j++) 26 { 27 cc=ts[j]; 28 ts[j]=ts[pos-j]; 29 ts[pos-j]=cc; 30 } 31 } 32 int main() 33 { 34 int i,j,k,len,p,q,f,nt,t; 35 scanf("%s",str); 36 len=strlen(str); 37 for(i=0;i<len;i++) 38 { 39 dp[i][i].s[0]=str[i]; 40 dp[i][i].s[1]='\0'; 41 dp[i][i].num=1; 42 } 43 for(p=1;p<len;p++) 44 for(i=0;i<len-p;i++) 45 { 46 j=i+p; 47 dp[i][j].num=inf; 48 for(k=1;k<p;k++) 49 { 50 if((p+1)%k) 51 continue; 52 q=i+k,t=i; 53 while(q<=j) 54 { 55 if(str[q]!=str[t]) 56 break; 57 q++; 58 t++; 59 if(t==i+k) 60 t=i; 61 } 62 if(q>j) 63 { 64 nt=(p+1)/k; 65 Int2S(nt); 66 strcpy(dp[i][j].s,ts); 67 dp[i][j].s[++pos]='('; 68 for(t=0;dp[i][i+k-1].s[t];t++) 69 dp[i][j].s[++pos]=dp[i][i+k-1].s[t]; 70 dp[i][j].s[++pos]=')'; 71 dp[i][j].num=pos+1; 72 dp[i][j].s[++pos]='\0'; 73 break; 74 } 75 } 76 for(k=i;k<j;k++) 77 { 78 if(dp[i][j].num>dp[i][k].num+dp[k+1][j].num) 79 { 80 dp[i][j].num=dp[i][k].num+dp[k+1][j].num; 81 strcpy(dp[i][j].s,dp[i][k].s); 82 strcat(dp[i][j].s,dp[k+1][j].s); 83 } 84 } 85 } 86 printf("%s\n",dp[0][len-1].s); 87 return 0; 88 }