BZOJ 1090: [SCOI2003]字符串折叠
Sol
区间DP.
转移很简单,枚举会形成的断长转移就行,话说上一题我就跟这个是差不多的思路,转移改了改,然后死活过不了...
同样都是SCOI的题...相差4年...
Code
/************************************************************** Problem: 1090 User: BeiYu Language: C++ Result: Accepted Time:20 ms Memory:1332 kb ****************************************************************/ #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N = 105; char c[N]; int f[N][N]; int bit(int x){ if(x>=100) return 3;if(x>=10) return 2;return 1; } int DP(int l,int r){ int &res=f[l][r];if(~res) return res; if(l>r) return res=0;if(l==r) return res=1;int len=r-l+1;res=len; for(int i=1;i<=len/2;i++) if(len%i==0){ int can=1; for(int j=l+i;j<=r;j++) if(c[j]!=c[(j-l)%i+l]){ can=0;break; } if(can) res=min(res,DP(l,l+i-1)+2+bit(len/i)); }for(int i=l;i<r;i++) res=min(res,DP(l,i)+DP(i+1,r)); return res; } int main(){ scanf("%s",c+1);int n=strlen(c+1);memset(f,-1,sizeof(f)); cout<<DP(1,n)<<endl; return 0; }