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

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

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

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<queue>
  6. #include<vector>
  7. #include<set>
  8. #include<map>
  9. #include<iostream>
  10. #include<algorithm>
  11. #define pa pair<int,int>
  12. #define ll long long
  13. #define N 3008
  14. #define mx 1e9
  15. using namespace std;
  16. int sc()
  17. {
  18. int i=0,f=1; char c=getchar();
  19. while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
  20. while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
  21. return i*f;
  22. }
  23. int fa[N],fb[N];
  24. int f[N][N],g[N][N];
  25. int a[N],b[N],c[N];
  26. int La,Lb,Lc,ans;
  27. int main()
  28. {
  29. La=sc();for(int i=1;i<=La;i++)a[i]=sc();
  30. Lb=sc();for(int i=1;i<=Lb;i++)b[i]=sc();
  31. Lc=sc();for(int i=1;i<=Lc;i++)c[i]=sc();
  32. for(int i=1;i<=La;i++)
  33. for(int j=1;j<=Lb;j++)
  34. if(a[i]==b[j])
  35. f[i][j]=f[i-1][j-1]+1;
  36. else
  37. f[i][j]=max(f[i][j-1],f[i-1][j]);
  38. if(!Lc)
  39. {
  40. printf("%d\n",f[La][Lb]);
  41. return 0;
  42. }
  43. for(int i=La;i>=1;i--)
  44. for(int j=Lb;j>=1;j--)
  45. if(a[i]==b[j])
  46. g[i][j]=g[i+1][j+1]+1;
  47. else
  48. g[i][j]=max(g[i][j+1],g[i+1][j]);
  49. for(int i=1;i<=La;i++)
  50. if(i>1&&a[i-1]!=c[1])fa[i]=fa[i-1];
  51. else for(int j=1,k=i;k<=La;k++)
  52. {
  53. if(a[k]==c[j])j++;
  54. if(j>Lc){fa[i]=k;break;}
  55. }
  56. for(int i=1;i<=Lb;i++)
  57. if(i>1&&b[i-1]!=c[1])fb[i]=fb[i-1];
  58. else for(int j=1,k=i;k<=Lb;k++)
  59. {
  60. if(b[k]==c[j])j++;
  61. if(j>Lc){fb[i]=k;break;}
  62. }
  63. for(int i=1;i<=La;i++)
  64. if(fa[i])
  65. for(int j=1;j<=Lb;j++)
  66. if(fb[j])
  67. ans=max(ans,f[i-1][j-1]+g[fa[i]+1][fb[j]+1]);
  68. ans?cout<<ans+Lc:cout<<-1;
  69. }

  

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. 173 Binary Search Tree Iterator 二叉搜索树迭代器

    实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器.调用 next() 将返回二叉搜索树中的下一个最小的数.注意: next() 和hasNext() 操作的时间复杂度是O(1),并使用 ...

  2. 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 ...

  3. C#特性的介绍及应用场景

    1.特性的任务:特性就是为了支持对象添加一些自我描述的信息,不影响类封装的前提添加额外信息.如果你用这个信息,那特性就有用:如果你不需要这个信息,那么这个特性就没用. 2.特性的基类:Attribut ...

  4. 阿里云OSS搭建移动应用直传服务的.Net C#示例

    OSS好几个都没有.Net示例,只有SDK 于是我就拿Java改成C#代码:使用前先去Nuget包管理器下载Aliyun.Acs.Core还有Aliyun.Acs.Sts: 在安装这个两个包的时候安装 ...

  5. AJPFX分析Android退出应用最优雅的方式

    什么是RS式呢?即Receiver+singleTask .我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前 ...

  6. 使用iconfont管理项目中的字体图标

    先来说说字体图标的好处: 很容易任意地缩放: 很容易地改变颜色: 很容易地产生阴影: 可以拥有透明效果: 一般来说,有先进的浏览器支持: 可以使用CSS来装饰(可以得到CSS很好支持): 可以快速转化 ...

  7. swift VTables

    VTables https://github.com/apple/swift/blob/master/docs/SIL.rst#vtables decl ::= sil-vtable sil-vtab ...

  8. SpringMVC 控制器统一异常处理

    摘要介绍spring mvc控制器中统一处理异常的两种方式:HandlerExceptionResolver以及@ExceptionHandler:以及使用@ControllerAdvice将@Exc ...

  9. java_tcp_简单示例

    package netProgram; import java.io.DataOutputStream; import java.io.IOException; import java.net.Ser ...

  10. Java IO(一)--File类

    File类不是单指文件,它既可以代表一个文件名称,又可以代表一个目录下的一组文件.可以用来创建.删除.遍历文件等 public static void main(String[] args) { St ...