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

 

posted on 2023-02-20 17:31  towboat  阅读(22)  评论(0)    收藏  举报