bzoj 1264 基因匹配
Written with StackEdit.
Description
卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的\(DNA\)序列由无数种碱基排列而成(地球上只有\(4\)种),而更奇怪的是,组成\(DNA\)序列的每一种碱基在该序列中正好出现\(5\)次!这样如果一个\(DNA\)序列有\(N\)种不同的碱基构成,那么它的长度一定是\(5N\)。
任务:编写一个程序:
- 从输入文件中读入两个等长的\(DNA\)序列;
- 计算它们的最长公共子序列长度;
- 向输出文件打印你得到的结果。
Input
输入文件中第一行有一个整数\(N\),表示这个星球上某种生物使用了N种不同的碱基,以后将它们编号为\(1…N\)的整数。
以下还有两行,每行描述一个\(DNA\)序列:包含\(5N\)个\(1…N\)的整数,且每一个整数在对应的序列中正好出现\(5\)次。
Output
输出文件中只有一个整数,即两个\(DNA\)序列的最长公共子序列长度。
Sample Input
2
1 1 2 2 1 1 2 1 2 2
1 2 2 2 1 1 2 2 1 1
Sample Output
7
HINT
[数据约束和评分方法]
\(60\%\)的测试数据中:\(1<=N <= 1000.\)
\(100\%\)的测试数据中:\(1<=N <= 20000.\)
Solution
- 朴素的\(O(n^2)dp\)只能解决\(60\%\)的部分.
- 注意到一个关键性质,每个数在每个序列中都恰好出现\(5\)次.
- 类似于给两个排列求\(LCS\),我们可以记录下每个数字在第一个序列\(a\)中从前往后的\(5\)个位置.
- 再处理第二个序列\(b\),此时我们处理当前数\(b[i]\)在第一个序列中每个出现的位置\(pos\).有\(a[pos]=b[i].\)
- 那么根据朴素\(dp\)的思路,定义\(f[i]\)为只用\(a\)序列的前\(i\)个数的\(LCS\)长度.
- 此时就可以完成更新\(f[pos]=max(f[1\)~\(pos-1])+1\).利用树状数组维护最大值进行优化.
- 特别注意:每个\(b[i]\)对应了\(5\)个\(pos\),而我们处理它们的时候应该从后往前倒序处理,否则先更新的会对后面的造成影响,破坏无后效性(类似01背包).
#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=2e5+10;
int ta[MAXN];
int va[MAXN][10];
int bit[MAXN];
int n;
inline void upd(int x,int c)
{
for(;x<=n;x+=lowbit(x))
bit[x]=max(bit[x],c);
}
inline int query(int x)
{
int res=0;
for(;x;x-=lowbit(x))
res=max(res,bit[x]);
return res;
}
int main()
{
n=read();
n*=5;
for(int i=1;i<=n;++i)
{
int t=read();
va[t][++ta[t]]=i;
}
for(int i=1;i<=n;++i)
{
int t=read();
for(int j=5;j>=1;--j)//值得细细斟酌
{
int pos=va[t][j];
int mx=query(pos-1)+1;
upd(pos,mx);
}
}
int ans=query(n);
printf("%d\n",ans);
return 0;
}
bzoj 1264 基因匹配的更多相关文章
- BZOJ 1264 基因匹配Match(LCS转化LIS)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列 ...
- BZOJ 1264 基因匹配(DP+线段树)
很有意思的一道题啊. 求两个序列的最大公共子序列.保证每个序列中含有1-n各5个. 如果直接LCS显然是TLE的.该题与普通的LCS不同的是每个序列中含有1-n各5个. 考虑LCS的经典DP方程.dp ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- BZOJ 1264: [AHOI2006]基因匹配Match( LCS )
序列最大长度2w * 5 = 10w, O(n²)的LCS会T.. LCS 只有当a[i] == b[j]时, 才能更新答案, 我们可以记录n个数在第一个序列中出现的5个位置, 然后从左往右扫第二个序 ...
- bzoj 1264: [AHOI2006]基因匹配Match
1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
- BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP
1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
- 基因匹配(bzoj 1264)
Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成DNA序列的每一种碱 ...
- 1264: [AHOI2006]基因匹配Match
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 982 Solved: 635[Submit][S ...
- 1264: [AHOI2006]基因匹配Match(动态规划神题)
1264: [AHOI2006]基因匹配Match 题目:传送门 简要题意: 给出两个序列.每个序列都由n种不同的数字组成,保证每个序列种每种数字都会出现5次(位置不一定一样),也就是序列长度为5*n ...
随机推荐
- linux 基础知识总结
1. 查看目录文件命令: 查看以f开头的文件:ll f* 查看/usr/local目录下的文件:ll /usr/local 按最后的修改的时间顺序,列出:ll -t */f* ...
- 利用ST MCU内部的基准参考电压监测电源电压及其它
源: 利用ST MCU内部的基准参考电压监测电源电压及其它
- 【Java】仿真qq尝试:用户注册(三)
需求: 实现用户名和密码存入数据库. 思路: 1.连接数据表用静态加载块 2.crud写成4个静态方法 具体流程: from:https://www.tutorialspoint.com/jdbc/j ...
- Django学习笔记之Django Form表单
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Linux 下的 core dump
core dump 的基本概念 当一个进程要异常终止时 ,可以选择把进程的用户空间内存数据全部保存到磁盘上 ,文件名通常是 core, 这叫做 Core Dump.通常情况下,core文件会 ...
- ASP.NET的内置对象
Request 该对象用于检索从浏览器向服务器所发送的请求中的信息.在按下“提交”按钮时,Request对象将读取和提取通过HTTP请求发送的参数.在用户提交表单时,包含在输入控件中的数据将与表单 ...
- protobuf与json转换
protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换 ...
- LeetCode第[17]题(Java):Letter Combinations of a Phone Number
题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...
- docker定义数据卷及数据卷的备份恢复
前言:生产环境中使用docker时,往往需要对数据进行持久化(只有把容器导出为镜像,才能够保存写的数据,否则容器删除或者停止,所有数据都会没有),或者需要在多个容器之间进行数据共享,这必然涉及容器的数 ...
- GitLab使用总结[转]
http://blog.csdn.net/huaishu/article/details/50475175 GitLab使用总结