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的序 ...
随机推荐
- 20155315 2017-05-10 《Java程序设计》课堂代码检查
一.教材代码检查-p98 代码要求 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号 代码链接 运行结果截图 二.在IDEA中以TDD的方式对String类和Arrays类进行 ...
- 20155323 2016-2017-2 《Java程序设计》第4周学习总结
20155323 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承的目的:继承是为了多态,能够采用父类引用指向子类对象,这样可以让代码更灵活.继承之后可以 ...
- 再论WPF中的UseLayoutRounding和SnapsToDevicePixels
原文:再论WPF中的UseLayoutRounding和SnapsToDevicePixels 版权声明:.net/web/医疗技术的木子纵横的个人分享 https://blog.csdn.net/m ...
- 【HNOI2014】世界树
题面 题解 虚树好题(只是细节太多) 构出虚树后,一定要仔细梳理关键点之间的点是上面属于父亲,下面属于儿子. 然后二分出所有的点的所属就可以了 代码 #include<cstdio> #i ...
- 【Loj10222】佳佳的Fibonacci
题面 题解 可以发现\(T(n)\)无法用递推式表示. 于是我们做如下变形: \[ T(n) = \sum _ {i = 1} ^ n i \times f_i \\ S(n) = \sum _ {i ...
- Jmeter使用HTTP代理服务器录制脚本
使用Jmeter录制脚本通常使用Badboy工具录制或者Jmeter自带的HTTP代理服务器录制脚本,这里说一下使用HTTP代理服务器录制时遇到的问题. 1. Jmeter安装 下载得到Jmeter ...
- TCP/IP 网路基础
一.引子 TCP/IP是"Transmission Control Protocol/Internet Protocol"的简写,翻译成中文为传输控制协议/互联网网 ...
- Tensorflow框架之AlexNet
from datetime import datetime import math import time import tensorflow as tf batch_size=32 num_batc ...
- Hyperledger Fabric中的Identity
Hyperledger Fabric中的Identity 什么是Identity 区块链网络中存在如下的角色:peers, orderers, client application, administ ...
- 亚马逊CEO贝索斯致股东信:阐述公司未来计划
亚马逊CEO 杰夫·贝索斯(Jeff Bezos)今天发布年度股东信, 详细描述了亚马逊的产品.服务和未来计划,当然,信中并没有任何的硬数据,比如说亚马逊Kindle的销量等等.但这封信也包括一些颇令 ...