题意:给出三个序列,求出前两个的公共子序列,且包含第三个序列,要求长度最长。

这道题目怎么做呢,f[i][j]表示a串1-i,b串1-j的最长,g[i][j]表示a串i-n,b串j-m最长,

那么只需要判断中间有没有包好c串就OK了,这样都是O(n^2)的。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define pa pair<int,int>
#define ll long long
#define N 3008
#define mx 1e9
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
int fa[N],fb[N];
int f[N][N],g[N][N];
int a[N],b[N],c[N];
int La,Lb,Lc,ans;
int main()
{
La=sc();for(int i=1;i<=La;i++)a[i]=sc();
Lb=sc();for(int i=1;i<=Lb;i++)b[i]=sc();
Lc=sc();for(int i=1;i<=Lc;i++)c[i]=sc();
for(int i=1;i<=La;i++)
for(int j=1;j<=Lb;j++)
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1;
else
f[i][j]=max(f[i][j-1],f[i-1][j]);
if(!Lc)
{
printf("%d\n",f[La][Lb]);
return 0;
}
for(int i=La;i>=1;i--)
for(int j=Lb;j>=1;j--)
if(a[i]==b[j])
g[i][j]=g[i+1][j+1]+1;
else
g[i][j]=max(g[i][j+1],g[i+1][j]);
for(int i=1;i<=La;i++)
if(i>1&&a[i-1]!=c[1])fa[i]=fa[i-1];
else for(int j=1,k=i;k<=La;k++)
{
if(a[k]==c[j])j++;
if(j>Lc){fa[i]=k;break;}
}
for(int i=1;i<=Lb;i++)
if(i>1&&b[i-1]!=c[1])fb[i]=fb[i-1];
else for(int j=1,k=i;k<=Lb;k++)
{
if(b[k]==c[j])j++;
if(j>Lc){fb[i]=k;break;}
}
for(int i=1;i<=La;i++)
if(fa[i])
for(int j=1;j<=Lb;j++)
if(fb[j])
ans=max(ans,f[i-1][j-1]+g[fa[i]+1][fb[j]+1]);
ans?cout<<ans+Lc:cout<<-1;
}

  

bzoj3304[Shoi2005]带限制的最长公共子序列 DP的更多相关文章

  1. bzoj3304 [Shoi2005]带限制的最长公共子序列

    dp,时间复杂度O(n^3),f[i][j][k]表示a串到i,b串到j的时候,匹配了c串的k位,要用滚动数组 代码 #include<cstring> #include<algor ...

  2. BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )

    求个LCS, 只是有了限制, 多加一维表示匹配到z串的第几个, 然后用滚动数组 ------------------------------------------------------------ ...

  3. LCS最长公共子序列~dp学习~4

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...

  4. POJ 1458 最长公共子序列(dp)

    POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...

  5. 【BZOJ2423】[HAOI2010]最长公共子序列 DP

    [BZOJ2423][HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  6. hdu 1159 Common Subsequence(最长公共子序列 DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  7. 38-最长公共子序列(dp)

    最长公共子序列 https://www.nowcoder.com/practice/c996bbb77dd447d681ec6907ccfb488a?tpId=49&&tqId=293 ...

  8. 最长公共子序列 DP

    class Solution: def LCS(self,A,B): if not A or not B: #边界处理 return 0 dp = [[0 for _ in range(len(B)+ ...

  9. 洛谷-P1439 【模板】最长公共子序列 (DP,离散化)

    题意:给两个长度为\(n\)的全排列,求他们的LCS 题解:这题给的数据范围到\(10^5\),用\(O(n^2)\)的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...

随机推荐

  1. Drawable(6)关于StateList的补充

    模板: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android=&quo ...

  2. 转-MySQL for Mac 安装和基本操作

    一.安装mysql 1.mysql下载地址:http://dev.mysql.com/downloads/mysql/ 2.安装软件包位于硬盘映象(.dmg)文件中,必须首先双击搜索起中的图标来安装该 ...

  3. TestNG基本注解(一)

    TestNG基本注解   注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中. @AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后. @Bef ...

  4. mysql配置mha高可用防火墙未关闭报错

    ########################################################################## l  问题背景:检查主从复制之后做高可用报错 [r ...

  5. [转]C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  6. (五)SpringIoc之Bean的作用域

    此文转自 https://blog.csdn.net/icarus_wang/article/details/51586776# 有状态bean和无状态bean请看 https://blog.csdn ...

  7. 中国版 Office 365 (X-Tenant / Tango) 功能验证报告 - 2 基本步骤

    说明: 1. 前期准备 - 在Azure上模拟出生产环境: 包括父域域控.子域域控.父域的Exchange Server.子域的Exchange Server.对Exchange Server, 需要 ...

  8. url编码函数encodeURI和encodeURIComponent

    var url = "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url)  //" ...

  9. Android反编译初步

    网上关于Android反编译的帖子很多,反编译的步骤也是很详细,本文Android反编译参考博客:https://www.cnblogs.com/dhcn/p/7120891.html 而反编译中最主 ...

  10. webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu

    按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...