问题
问题就是折叠字符串,例如ACBACB可以折叠成2(ACB),并且折叠可以嵌套,字符串长度是n(1<n<=100),求最短的折叠
分析
状态比较易懂,dp[i][j]代表[i,j]这一段能压缩成的最短字符串
然后分为三种情况决策,1.不能压缩的 2.能部分压缩的(就是分开后再压缩) 3.整体能压缩的
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=105;
//int slen[maxn][maxn];
string dp[maxn][maxn],str;
//计算重复的最小长度
int fold(const string &s){
int len=s.length();
for(int i=1;i*2<=len;++i){
if(len%i) continue;
bool isFold=true;
for(int j=0;j<len-i;++j){
if(s[j]!=s[j+i]){
isFold=false;
break;
}
}
if(isFold) return i;
}
return 0;
}
//折叠分为三种情况 1.不能折叠 2.部分折叠 3.整体都能折叠
int DFS(int left,int right){
string &ans=dp[left][right];
if(ans!=""