博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4275 : [ONTAK2015]Badania naukowe
阅读量:5305 次
发布时间:2019-06-14

本文共 1086 字,大约阅读时间需要 3 分钟。

设f[i][j]为a[1..i]与b[1..j]的LCS,g[i][j]为a[i..n]与b[j..m]的LCS。

若C为0,则ans=f[n][m]。

否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。

则ans=max(f[i-1][j-1]+g[d[i]+1][e[j]+1]+C)。

时间复杂度$O(n^2)$。

 

#include
#define N 3010int n,m,C,i,j,k,a[N],b[N],c[N],f[N][N],g[N][N],d[N],e[N],ans=-1;inline int max(int a,int b){return a>b?a:b;}int main(){ for(scanf("%d",&n),i=1;i<=n;i++)scanf("%d",&a[i]); for(scanf("%d",&m),i=1;i<=m;i++)scanf("%d",&b[i]); for(scanf("%d",&C),i=1;i<=C;i++)scanf("%d",&c[i]); for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]=a[i]==b[j]?(f[i-1][j-1]+1):max(f[i-1][j],f[i][j-1]); if(!C)return printf("%d",f[n][m]),0; for(i=n;i;i--)for(j=m;j;j--)g[i][j]=a[i]==b[j]?(g[i+1][j+1]+1):max(g[i+1][j],g[i][j+1]); for(i=1;i<=n;i++)for(j=i,k=1;j<=n;j++){ if(a[j]==c[k])k++; if(k>C){d[i]=j;break;} } for(i=1;i<=m;i++)for(j=i,k=1;j<=m;j++){ if(b[j]==c[k])k++; if(k>C){e[i]=j;break;} } for(i=1;i<=n;i++)if(d[i])for(j=1;j<=m;j++)if(e[j])ans=max(ans,f[i-1][j-1]+g[d[i]+1][e[j]+1]+C); return printf("%d",ans),0;}

  

转载于:https://www.cnblogs.com/clrs97/p/4849418.html

你可能感兴趣的文章
TCP粘包拆包问题
查看>>
Java中Runnable和Thread的区别
查看>>
SQL Server中利用正则表达式替换字符串
查看>>
POJ 1015 Jury Compromise(双塔dp)
查看>>
论三星输入法的好坏
查看>>
Linux 终端连接工具 XShell v6.0.01 企业便携版
查看>>
JS写一个简单日历
查看>>
LCA的两种求法
查看>>
Python 发 邮件
查看>>
mysql忘记密码的解决办法
查看>>
全面分析Java的垃圾回收机制2
查看>>
[Code Festival 2017 qual A] C: Palindromic Matrix
查看>>
修改博客园css样式
查看>>
Python3 高阶函数
查看>>
初始面向对象
查看>>
docker一键安装
查看>>
leetcode Letter Combinations of a Phone Number
查看>>
ALS算法 (面试准备)
查看>>
Unity 5.4 测试版本新特性---因吹丝停
查看>>
7.5 文件操作
查看>>