【BZOJ4275】[ONTAK2015]Badania naukowe DP
【BZOJ4275】[ONTAK2015]Badania naukowe
Description
Input
Output
Sample Input
1 2 2 3 1 1 2
6
1 2 1 3 1 2
2
3 2
Sample Output
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的更多相关文章
- #5【BZOJ4275】[ONTAK2015]Badania
Description 给定三个数字串A,B,C,请找到一个A,B的最长公共子序列,满足C是该子序列的子串. Input 第一行包含一个正整数n(1<=n<=3000),表示A串的长度. ...
- 【BZOJ4298】[ONTAK2015]Bajtocja
[BZOJ4298][ONTAK2015]Bajtocja Description 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任何边.接下来有m次操作,每次操作会给出a,b,k,意 ...
- 【BZOJ4712】洪水(动态dp)
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...
- 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组
[BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...
- 【BZOJ4245】[ONTAK2015]OR-XOR 贪心
[BZOJ4245][ONTAK2015]OR-XOR Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所 ...
- 【BZOJ4281】[ONTAK2015]Związek Harcerstwa Bajtockiego LCA
[BZOJ4281][ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后 ...
- 【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 ...
- 【题解】Jury Compromise(链表+DP)
[题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...
- 【题解】Making The Grade(DP+结论)
[题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...
随机推荐
- 搜狐畅游CEO王滔辞职
凤凰科技讯 11月3日消息,搜狐公布公告确认搜狐畅游CEO离职.公告称王滔因个人原因辞去畅游首席运行官职务.将继续担任畅游公司董事和首席产品官. 据搜狐公告,董事会任命搜狐总裁余楚媛与畅游总裁陈德文为 ...
- Mac删除.svn文件
find . -type d -name ".svn"|xargs rm -rf
- LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg (转)
Select/Distinct操作符 适用场景:o(∩_∩)o… 查询呗. 说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也 ...
- express 设置header解决跨域问题
//设置跨域访问 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", ...
- unity, 导出对象到另一个项目
----更新(2015-6-26): 今天又试了一下,有时候prefabs不用导出直接拷贝过去也能用,但有时候不行.还不太清楚原因. ----旧帖: 一,正确做法: 一个对象包括资源和Hierarch ...
- setTimeout 的用法
只有第二种和第三种是正确的用法. setTimeout(函数名, 延迟) setTimeout(show(), 1000); show() 是函数运行,这种传递方式真正传进去的是 show 函数的返回 ...
- Rust 1.7.0 处理命令行參数
std是 Rust 标准函数库: env 模块提供了处理环境函数. 在使用标准函数库的时候,使用 use 导入对应的 module . 一.直接输出 use std::env; fn main(){ ...
- hdu 2066 一个人的旅行(dijkstra)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Codeforces Round #235 (Div. 2) C. Team
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- filter函数和map函数
filter filter()函数接收一个函数 f 和一个可迭代对象,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返 ...