原题传送门
分析:区间与区间的关系,区间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;
}

本文介绍了一种使用区间动态规划解决字符串折叠问题的方法。通过分析字符串区间关系,利用DP算法寻找最优折叠方案,并通过check函数验证区间是否可以折叠。代码实现了从单字符到整个字符串的有效折叠,最终输出最小折叠次数。
&spm=1001.2101.3001.5002&articleId=113248251&d=1&t=3&u=2fc3496cdc6a4e8e833f71a45c6ad3e9)
453

被折叠的 条评论
为什么被折叠?



