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模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...
随机推荐
- 173 Binary Search Tree Iterator 二叉搜索树迭代器
实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器.调用 next() 将返回二叉搜索树中的下一个最小的数.注意: next() 和hasNext() 操作的时间复杂度是O(1),并使用 ...
- Jmeter+Jenkins+Ant自动化集成环境搭建
搭建环境: JDK:jdk1.8.0_92 Ant:apache-ant-1.9.7 Jmeter: apache-jmeter-3.0 Jenkins:jenkins-2.19.3 具体环境配置 1 ...
- C#特性的介绍及应用场景
1.特性的任务:特性就是为了支持对象添加一些自我描述的信息,不影响类封装的前提添加额外信息.如果你用这个信息,那特性就有用:如果你不需要这个信息,那么这个特性就没用. 2.特性的基类:Attribut ...
- 阿里云OSS搭建移动应用直传服务的.Net C#示例
OSS好几个都没有.Net示例,只有SDK 于是我就拿Java改成C#代码:使用前先去Nuget包管理器下载Aliyun.Acs.Core还有Aliyun.Acs.Sts: 在安装这个两个包的时候安装 ...
- AJPFX分析Android退出应用最优雅的方式
什么是RS式呢?即Receiver+singleTask .我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前 ...
- 使用iconfont管理项目中的字体图标
先来说说字体图标的好处: 很容易任意地缩放: 很容易地改变颜色: 很容易地产生阴影: 可以拥有透明效果: 一般来说,有先进的浏览器支持: 可以使用CSS来装饰(可以得到CSS很好支持): 可以快速转化 ...
- swift VTables
VTables https://github.com/apple/swift/blob/master/docs/SIL.rst#vtables decl ::= sil-vtable sil-vtab ...
- SpringMVC 控制器统一异常处理
摘要介绍spring mvc控制器中统一处理异常的两种方式:HandlerExceptionResolver以及@ExceptionHandler:以及使用@ControllerAdvice将@Exc ...
- java_tcp_简单示例
package netProgram; import java.io.DataOutputStream; import java.io.IOException; import java.net.Ser ...
- Java IO(一)--File类
File类不是单指文件,它既可以代表一个文件名称,又可以代表一个目录下的一组文件.可以用来创建.删除.遍历文件等 public static void main(String[] args) { St ...