BZOJ 1264 基因匹配(DP+线段树)
很有意思的一道题啊。
求两个序列的最大公共子序列。保证每个序列中含有1-n各5个。
如果直接LCS显然是TLE的。该题与普通的LCS不同的是每个序列中含有1-n各5个。
考虑LCS的经典DP方程。dp[i][j]=dp[i-1][j-1]+1.(a[i]==b[j])。 dp[i][j]=max(dp[i-1][j],dp[i][j-1]).(a[i]!=b[j])。
如果换个角度看看。令dp[i][j]表示a序列以i结尾,b序列到j的最大公共子序列长度。
则有dp[i][j]=max(dp[k][j])+1.(a[i]==b[j]&&k<i)。 dp[i][j]=max(dp[i][k]).(a[i]!=b[j]&&k<j).
如果从b序列从左向右更新状态的话。第一个转移就是求前缀最大值。第二个转移实际就是不变。
因此维护一个线段树即可。
# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... int a[N*], b[N*], vis[N][], cnt[N], seg[N*]; void push_up(int p){seg[p]=max(seg[p<<],seg[p<<|]);}
int query(int p, int l, int r, int R){
if (R<l) return ;
if (R>=r) return seg[p];
int mid=(l+r)>>;
return max(query(lch,R),query(rch,R));
}
void update(int p, int l, int r, int L, int val){
if (L>r||L<l) return ;
if (L==l&&L==r) seg[p]=max(seg[p],val);
else {
int mid=(l+r)>>;
update(lch,L,val); update(rch,L,val); push_up(p);
}
}
int main ()
{
int n;
scanf("%d",&n);
FOR(i,,n*) {
scanf("%d",a+i);
vis[a[i]][++cnt[a[i]]]=i;
}
FOR(i,,n*) {
scanf("%d",b+i);
for (int j=; j>=; --j) {
int tmp=query(,,n*,vis[b[i]][j]-)+;
update(,,n*,vis[b[i]][j],tmp);
}
}
printf("%d\n",query(,,n*,n*));
return ;
}
BZOJ 1264 基因匹配(DP+线段树)的更多相关文章
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- bzoj 1264 基因匹配
Written with StackEdit. Description 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的\(DNA\)序列由无数种碱基排列而成(地球上只有\(4\)种) ...
- BZOJ 1264 基因匹配Match(LCS转化LIS)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列 ...
- BZOJ 1835 基站选址(DP+线段树)
# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream& ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
随机推荐
- 20155320《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155320<Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容及步骤 (一)命令行下Java程序开发 步骤一:首先在cmd中输入d:和cd ljq20155320进 ...
- nginx重启无法找到PId的解决办法
nginx停止的时候,出现了如下错误 nginx: [error] open() "/export/servers/nginx/logs/nginx.pid" failed (2: ...
- 【LG3229】[HNOI2013]旅行
题面 洛谷 题解 勘误:新的休息点a需要满足的条件2为那一部分小于等于ans 代码 \(100pts\) #include <iostream> #include <cstdio&g ...
- RegExp,实现匹配合法邮箱(英文邮箱)的正则表达式
邮箱列表:@qq.com.@vip.qq.com.@foxmail.com,数字邮箱暂时不考虑 以下邮箱列表用于测试: lihaha@qq.com lihaha@vip.qq.com lihaha@f ...
- Maven学习(十六)-----Maven存储库
什么是Maven资源库? 在 Maven 术语里存储库是一个目录,即目录中保存所有项目的 jar 库,插件或任何其他项目特定文件,并可以容易由 Maven 使用. Maven库中有三种类型 local ...
- nodejs的路径问题
最近公司的一个开发项目,后端用的是nodejs.这两天需要打包给客户演示,就让公司一个小伙把之前3D机房的打包工具移植过来.打包之后,发现原本在开发环境下的跑的好好的项目,不能访问了.出现项目的首页不 ...
- 131. 分割回文串 javascript实现
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa",&quo ...
- centos 系统初始化
centos 系统初始化 #!/bin/bash # author cfwl create date of 2012-10-21 # blog http://cfwlxf.blog.51cto.com ...
- Python基础知识-05-数据类型总结字典
python其他知识目录 1.一道题,选择商品的序号.程序员和用户各自面对的序号起始值 如有变量 googs = ['汽车','飞机','火箭'] 提示用户可供选择的商品: 0,汽车1,飞机2,火箭用 ...
- 用js两张图片合并成一张图片
JS和canvas的合成方式 function drawAndShareImage(){ var canvas = document.createElement("canvas") ...