【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; }
相关文章推荐
- 40.TabLayout的简单使用
- 日常任务优先级管理
- java初识类和对象
- [华为OJ] 判断两个IP是否属于同一子网
- 18javaScript与表单
- sql约束
- MySQL同步到Hive操作步骤
- 并查集
- 开博客的第一天
- 笔记----httpd安装启动流程
- Jquery 全选、反选问题解析
- 17History link image location anchor对象
- 一天一条Linux指令-mv
- Android 给控件设置双击事件
- android中intent的作用
- Android 属性动画
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记16)
- ubuntu-14.04.3下安装VMware Tools(虚拟机与主机之间直接复制粘贴)
- jQuery 的 extend 扩展方法
- Apache httpd配置虚拟主机的三种方法