BZOJ 1090 字符串折叠(区间DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090

题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CCD,注意数字的长度和圆括号都算最后长度。求一种折叠方式使得总长度最小。

思路:记忆化搜索。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
char s[],a[];
int f[][];
bool ok(int l,int r,int len){
int L=;
for (int i=l;i<=l+len-;i++)
a[++L]=s[i];
int num=(r-l+)/len;
for (int i=;i<=num;i++)
for (int j=;j<=len;j++)
if (a[j]!=s[l+(i-)*len+j-]) return ;
return ;
}
int cal(int x){
if (x<) return ;
if (x<=) return ;
return ;
}
int dp(int l,int r){
if (f[l][r]!=-) return f[l][r];
if (l==r) return ;
int len=r-l+;
f[l][r]=len;
for (int i=l;i<r;i++)
f[l][r]=std::min(f[l][r],dp(l,i)+dp(i+,r));
for (int i=;i<len;i++)
if (len%i==&&ok(l,r,i)) f[l][r]=std::min(f[l][r],dp(l,l+i-)+cal(len/i)+);
return f[l][r];
}
int main(){
scanf("%s",s+);
int n=strlen(s+);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
f[i][j]=-;
printf("%d\n",dp(,n));
}
上一篇:Bash Shell字符串操作


下一篇:READONLY、、cursor、、VARYING