原题传送门
分析:区间与区间的关系,区间DP
check() 检查区间[i,j]能否折叠
#include <bits/stdc++.h>
using namespace std;
const int N=105;
char s[N];
int f[N][N],cn[N];
int check(int i,int j,int l)
{
for(int k=i;k<=j;k++)
{
if(s[k]!=s[(k-i)%l+i]) return 0;
}
return 1;
}
int main()
{
memset(f,6,sizeof f);
scanf("%s",s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++) f[i][i]=1;
for(int i=1;i<=99;i++)
{
if(i<=9) cn[i]=1;//前面数字占的位数
else cn[i]=2;
}
cn[100]=3;
for(int p=1;p<n;p++)
{
for(int i=1;i+p<=n;i++)
{
int j=i+p;
for(int k=i;k<j;k++)
{
int l=k-i+1;
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
if((p+1)%l!=0) continue ;
//区间[i,j(i+p)]长度为p+1,如果不能被len整除,则无法折叠
if(check(i,j,l))
{
f[i][j]=min(f[i][j],f[i][k]+2+cn[(p+1)/l]);
//cout<<cn[(p+1)/l]<<' ';
}
}
}
}
cout<<f[1][n];
return 0;
}