您的位置:首页 > 其它

【Codeforces 682D】【String】

2016-07-12 15:32 369 查看

题目大意

有两种字符串S,T。长度分别为n,m。现在需要在S里面有序地选出k个子串,且在T中出现的顺序与这k个子串的顺序相同。问这k个子串最大的长度和

题解

lcs的变种,设f[i][j][k][0,1]s匹配到i,t匹配到j,分成k块,是否需要新开块。按照s[i]与t[j]比较结果转移,i,j都加1,f也加1,看要不要开块。i,j分别加1,f不变,打一个开块的标记。详细看代码。

code

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=1000,maxm=1000,maxK=10;
int n,m,K,f[maxn+2][maxm+2][maxK+2][2];
char s[maxn+10],t[maxm+10];
int main(){
//freopen("string.in","r",stdin);
//freopen("string.out","w",stdout);
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d%d%d\n",&n,&m,&K);
scanf("%s\n",s+1);
scanf("%s\n",t+1);
memset(f,200,sizeof(f));
f[0][0][0][0]=0;
fo(i,0,n)
fo(j,0,m)
fo(k,0,K){
if(s[i]==t[j]){
if(i&&j){
f[i][j][k][1]=max(f[i][j][k][1],f[i-1][j-1][k][1]+1);
if(k)f[i][j][k][1]=max(f[i][j][k][1],f[i-1][j-1][k-1][0]+1);
}
}
if(i)f[i][j][k][0]=max(f[i][j][k][0],max(f[i-1][j][k][0],f[i-1][j][k][1]));
if(j)f[i][j][k][0]=max(f[i][j][k][0],max(f[i][j-1][k][0],f[i][j-1][k][1]));
}
int ans=0;
fo(k,0,K)ans=max(ans,max(f
[m][k][0],f
[m][k][1]));
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: