我是靠谱客的博主 深情山水,这篇文章主要介绍【poj 2176】Folding 区间dp,现在分享给大家,希望可以做个参考。

额,有点郁闷的是我语言选的是G++结果T了几发,改成C++后又CE因为string类在C++中的头文件是string而不是string.h

bzoj1090的升级版,输出结果,但是话说回来其实也没怎么变复杂,思路嘛枚举中间的断点然后记忆化递归处理,每一次处理一段的时候再暴力检验能否将这一段直接折叠,最后加上数字长度和括号就ok了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; int f[105][105],len; char s[150]; string ans[105][105]; int Q(int x){return x==0 ? 0 : Q(x/10)+1;} bool check(int a,int b,int x,int y){ int la=b-a+1,lb=y-x+1; if(lb%la!=0)return false; for(int i=x;i<=y;i++){ if(s[a+(i-x)%la]!=s[i])return false; } return true; } int dfs(int l,int r){ int& x=f[l][r]; if(l==r)return ans[l][r]=s[l],x=1; if(x)return x; ans[l][r].clear(); x=r-l+1; for(int i=l;i<=r;i++)ans[l][r]+=s[i]; for(int i=l;i<r;i++){ int z=dfs(l,i)+dfs(i+1,r); if(z<x)x=z,ans[l][r]=ans[l][i]+ans[i+1][r]; if(check(l,i,i+1,r)){ int y=f[l][i]+2+Q((r-l+1)/(i-l+1)); if(y<x){ x=y;char ss[7]; sprintf(ss,"%d",(r-l+1)/(i-l+1)); ans[l][r]=ss+string("(")+ans[l][i]+string(")"); } } } return x; } int main(){ while(scanf("%s",s+1)!=EOF){ memset(f,0,sizeof(f)); len=strlen(s+1); dfs(1,len); cout<<ans[1][len]<<endl; } return 0; }



最后

以上就是深情山水最近收集整理的关于【poj 2176】Folding 区间dp的全部内容,更多相关【poj内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部