【BZOJ4275】[ONTAK2015]Badania naukowe

Description

给定三个数字串A,B,C,请找到一个A,B的最长公共子序列,满足C是该子序列的子串。

Input

第一行包含一个正整数n(1<=n<=3000),表示A串的长度。
第二行包含n个正整数,其中第i个数表示A[i](1<=A[i]<=1000)。
第三行包含一个正整数m(1<=m<=3000),表示B串的长度。
第四行包含m个正整数,其中第i个数表示B[i](1<=B[i]<=1000)。
第五行包含一个整数k(0<=k<=3000),表示C串的长度。
第六行包含k个正整数,其中第i个数表示C[i](1<=C[i]<=1000)。

Output

输出一个整数,即满足条件的最长公共子序列的长度,如果无解输出-1。特别的,如果k为0且无解,请输出0。

Sample Input

7
1 2 2 3 1 1 2
6
1 2 1 3 1 2
2
3 2

Sample Output

4

HINT

找到的最长个公共子序列为(1,2,3,2)。

题解:我们先对于A和B的每个位置,处理出所有以i为结尾的,与C相同的子序列中,起始点最靠右的起始点位置pa[i]和pb[i]。然后处理出A和B的前缀最长公共子序列和后缀最长公共子序列f和g。用f[pa[i]-1][pb[j]-1]+g[i+1][j+1]更新答案即可。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int A,B,C,ans;
int a[3010],b[3010],c[3010];
int f[3010][3010],g[3010][3010],pa[3010],pb[3010];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
int i,j,k;
for(A=rd(),i=1;i<=A;i++) a[i]=rd();
for(B=rd(),i=1;i<=B;i++) b[i]=rd();
for(C=rd(),i=1;i<=C;i++) c[i]=rd();
for(i=1;i<=A;i++) for(j=1;j<=B;j++)
{
f[i][j]=max(f[i][j-1],f[i-1][j]);
if(a[i]==b[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
if(!C)
{
printf("%d",f[A][B]);
return 0;
}
for(i=A;i>=1;i--) for(j=B;j>=1;j--)
{
g[i][j]=max(g[i][j+1],g[i+1][j]);
if(a[i]==b[j]) g[i][j]=max(g[i][j],g[i+1][j+1]+1);
}
for(i=1;i<=A;i++)
{
for(k=i,j=C;k>=1;k--)
{
if(a[k]==c[j]) j--;
if(!j) break;
}
pa[i]=k-1;
}
for(i=1;i<=B;i++)
{
for(k=i,j=C;k>=1;k--)
{
if(b[k]==c[j]) j--;
if(!j) break;
}
pb[i]=k-1;
}
for(i=1;i<=A;i++) for(j=1;j<=B;j++) if(pa[i]!=-1&&pb[j]!=-1) ans=max(ans,f[pa[i]][pb[j]]+g[i+1][j+1]+C);
if(!ans) printf("-1");
else printf("%d",ans);
return 0;
}

【BZOJ4275】[ONTAK2015]Badania naukowe DP的更多相关文章

  1. #5【BZOJ4275】[ONTAK2015]Badania

    Description 给定三个数字串A,B,C,请找到一个A,B的最长公共子序列,满足C是该子序列的子串. Input 第一行包含一个正整数n(1<=n<=3000),表示A串的长度. ...

  2. 【BZOJ4298】[ONTAK2015]Bajtocja

    [BZOJ4298][ONTAK2015]Bajtocja Description 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任何边.接下来有m次操作,每次操作会给出a,b,k,意 ...

  3. 【BZOJ4712】洪水(动态dp)

    [BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...

  4. 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组

    [BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...

  5. 【BZOJ4245】[ONTAK2015]OR-XOR 贪心

    [BZOJ4245][ONTAK2015]OR-XOR Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所 ...

  6. 【BZOJ4281】[ONTAK2015]Związek Harcerstwa Bajtockiego LCA

    [BZOJ4281][ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后 ...

  7. 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流

    [BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...

  8. 【题解】Jury Compromise(链表+DP)

    [题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...

  9. 【题解】Making The Grade(DP+结论)

    [题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...

随机推荐

  1. 从JavaScript 数组去重看兼容性有关问题,及性能优化(摘自玉伯博客)

    JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScr ...

  2. Android - 资源(resource)转换为String

    资源(resource)转换为String 本文地址: http://blog.csdn.net/caroline_wendy Android建议资源的动态绑定, 即把string写入资源内, 然后运 ...

  3. mysql 开启慢查询 如何打开mysql的慢查询日志记录

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢,接下来将详细为您介绍 原文出自:http://www.jbxue ...

  4. [na]华为acl(traffic-filter)和dhcp管理

    这个是财务网络的一个问题, 要求财务的某台机器能访问其他部门区的打印机. 其他部门是不能访问到财务网络的. 华为alc配置实例:-traffic-filter # 在VLAN100上配置基于ACL的报 ...

  5. 推荐一个入门最佳Git教程

    这是我最近发现的一个针对入门Git教程,浅显易懂,点到为止,很适合初学者及使用Git的爱好者,学完该教程应付开发工作绰绰有余. http://www.liaoxuefeng.com/wiki/0013 ...

  6. JQM事件详解

    在前文<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础>中,Kayo 对 jQuery Mobile 事件的基 ...

  7. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾

    1.全选并复制到系统剪贴板 ggVG或ggvG 然后 "+y gg 让光标移到首行,在vim才有效,vi中无效 V 是进入Visual(可视)模式 G 光标移到最后一行 "+y 复 ...

  8. cocos2d-x中的宏定义CC_PROPERTY

    cocos2d-x定义了很多宏定义,帮我们提高开发效率,下面看下CC_PROPERTY, CC_PROPERTY定义 CC_PROPERTY的声明在CCPlatformMacros.h中,结构如下 # ...

  9. Building and running Node.js for Android

    转自: http://www.goland.org/nodejsonandroid/ Building and running Node.js for Android October 14, 2014 ...

  10. Struts2初学 Struts2在Action获取内置对象request,session,application(即ServletContext)

    truts2在Action中如何访问request,session,application(即ServletContext)对象???? 方式一:与Servlet API解耦的方式      可以使用 ...