poj 2176-Folding解题报告

现在在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 }
posted @ 2012-06-06 00:26  zhenhai  阅读(417)  评论(0编辑  收藏  举报