[SCOI2003]字符串折叠
一道蛮好玩的区间DP。。。其实只要做好check。。。然后统计答案就好了。。。QAQ。。。
呆码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char ch[110]; int n,f[110][110]; inline bool check(int x1,int y1,int x2,int y2) { if((y2-x1+1)%(y1-x1+1)!=0) return 0; int len=y1-x1+1; for(int i=x2;i<=y2;i++) if(ch[i-len]!=ch[i]) return 0; return 1; } inline int num(int x) { int sum=0; while(x) { sum++; x/=10; } return sum; } int main() { scanf("%s",ch+1); n=strlen(ch+1); for(int i=1;i<=n;i++) f[i][i]=1; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) { f[i][j]=j-i+1; for(int k=i;k<=j;k++) { if(check(i,k,k+1,j)) f[i][j]=min(f[i][j],f[i][k]+2+num((j-i+1)/(k-i+1))); else f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); } } printf("%d\n",f[1][n]); }