概述
额,有点郁闷的是我语言选的是G++结果T了几发,改成C++后又CE因为string类在C++中的头文件是string而不是string.h
bzoj1090的升级版,输出结果,但是话说回来其实也没怎么变复杂,思路嘛枚举中间的断点然后记忆化递归处理,每一次处理一段的时候再暴力检验能否将这一段直接折叠,最后加上数字长度和括号就ok了
#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 2176】Folding 区间dp所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复