bzoj3304[Shoi2005]带限制的最长公共子序列 DP
题意:给出三个序列,求出前两个的公共子序列,且包含第三个序列,要求长度最长。
这道题目怎么做呢,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的更多相关文章
- bzoj3304 [Shoi2005]带限制的最长公共子序列
dp,时间复杂度O(n^3),f[i][j][k]表示a串到i,b串到j的时候,匹配了c串的k位,要用滚动数组 代码 #include<cstring> #include<algor ...
- BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )
求个LCS, 只是有了限制, 多加一维表示匹配到z串的第几个, 然后用滚动数组 ------------------------------------------------------------ ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- POJ 1458 最长公共子序列(dp)
POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...
- 【BZOJ2423】[HAOI2010]最长公共子序列 DP
[BZOJ2423][HAOI2010]最长公共子序列 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- 38-最长公共子序列(dp)
最长公共子序列 https://www.nowcoder.com/practice/c996bbb77dd447d681ec6907ccfb488a?tpId=49&&tqId=293 ...
- 最长公共子序列 DP
class Solution: def LCS(self,A,B): if not A or not B: #边界处理 return 0 dp = [[0 for _ in range(len(B)+ ...
- 洛谷-P1439 【模板】最长公共子序列 (DP,离散化)
题意:给两个长度为\(n\)的全排列,求他们的LCS 题解:这题给的数据范围到\(10^5\),用\(O(n^2)\)的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...
随机推荐
- Drawable(6)关于StateList的补充
模板: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android=&quo ...
- 转-MySQL for Mac 安装和基本操作
一.安装mysql 1.mysql下载地址:http://dev.mysql.com/downloads/mysql/ 2.安装软件包位于硬盘映象(.dmg)文件中,必须首先双击搜索起中的图标来安装该 ...
- TestNG基本注解(一)
TestNG基本注解 注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中. @AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后. @Bef ...
- mysql配置mha高可用防火墙未关闭报错
########################################################################## l 问题背景:检查主从复制之后做高可用报错 [r ...
- [转]C#委托Action、Action<T>、Func<T>、Predicate<T>
CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...
- (五)SpringIoc之Bean的作用域
此文转自 https://blog.csdn.net/icarus_wang/article/details/51586776# 有状态bean和无状态bean请看 https://blog.csdn ...
- 中国版 Office 365 (X-Tenant / Tango) 功能验证报告 - 2 基本步骤
说明: 1. 前期准备 - 在Azure上模拟出生产环境: 包括父域域控.子域域控.父域的Exchange Server.子域的Exchange Server.对Exchange Server, 需要 ...
- url编码函数encodeURI和encodeURIComponent
var url = "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url) //" ...
- Android反编译初步
网上关于Android反编译的帖子很多,反编译的步骤也是很详细,本文Android反编译参考博客:https://www.cnblogs.com/dhcn/p/7120891.html 而反编译中最主 ...
- webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu
按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...