https://www.luogu.com.cn/problem/P4302
求字符串的最短折叠
AAAAAAAAAABABABCCD 的最短折叠为: 9(A)3(AB)CCD。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std ;
#define N 102
char s[N];
int n,f[N][N];
bool chk(int l,int r,int k){
int len=k-l+1;
for(int i=l;i<=r;i++)
if(s[i]!=s[(i-l)%len+l]) return 0;
return 1;
}
int LEN(int k){
if(k>99) return 3;
return k>9?2:1;
}
void solve(){
int i,j,k;
n=strlen(s+1);
memset(f,127,sizeof f);
for(i=1;i<=n;i++)
f[i][i]=1;
for(int len=2;len<=n;len++)
for(i=1;i+len-1<=n;i++){
j=i+len-1;
for(k=i;k<j;k++){
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
for(k=i;k<j;k++){
if(len%(k-i+1)==0&&chk(i,j,k))
f[i][j]=min(f[i][j],f[i][k]+2+LEN(len/(k-i+1)) );
}
}
cout<<f[1][n]<<endl;
}
int main(){
cin>>s+1; solve();
}
浙公网安备 33010602011771号