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 }

转载于:https://www.cnblogs.com/caozhenhai/archive/2012/06/06/2537504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值