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;
}