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 基因匹配的更多相关文章

  1. BZOJ 1264 基因匹配Match(LCS转化LIS)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列 ...

  2. BZOJ 1264 基因匹配(DP+线段树)

    很有意思的一道题啊. 求两个序列的最大公共子序列.保证每个序列中含有1-n各5个. 如果直接LCS显然是TLE的.该题与普通的LCS不同的是每个序列中含有1-n各5个. 考虑LCS的经典DP方程.dp ...

  3. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  4. BZOJ 1264: [AHOI2006]基因匹配Match( LCS )

    序列最大长度2w * 5 = 10w, O(n²)的LCS会T.. LCS 只有当a[i] == b[j]时, 才能更新答案, 我们可以记录n个数在第一个序列中出现的5个位置, 然后从左往右扫第二个序 ...

  5. bzoj 1264: [AHOI2006]基因匹配Match

    1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

  6. BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP

    1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

  7. 基因匹配(bzoj 1264)

    Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成DNA序列的每一种碱 ...

  8. 1264: [AHOI2006]基因匹配Match

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 982  Solved: 635[Submit][S ...

  9. 1264: [AHOI2006]基因匹配Match(动态规划神题)

    1264: [AHOI2006]基因匹配Match 题目:传送门 简要题意: 给出两个序列.每个序列都由n种不同的数字组成,保证每个序列种每种数字都会出现5次(位置不一定一样),也就是序列长度为5*n ...

随机推荐

  1. angularjs 的controller的三种写法

    AngularJS 的controller其实就是一个方法,它有三种写法: 第一种: <pre name="code" class="javascript" ...

  2. CAS单点登录的配置

    先说单点登录是个啥? 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录. 配置的步骤如下: 1.生成安全证书 Cas serve ...

  3. SQL中的几个判断是否存在

    库是否存在if exists(select * from master..sysdatabases wherename=N'库名')print 'exists'elseprint 'not exist ...

  4. 【Head First Servlets and JSP】笔记

    1.谈到服务器的时候,可能是指物理主机(硬件),也可能是指Web服务应用(软件). 2.谈到客户的时候,通常指人类用户,或者是浏览器应用,或者两者都包括,浏览器应用做些什么?发送请求.解释HTML和呈 ...

  5. QString类

    1.将QString所有字母大写 QString.toUpper() 2.将QString所有字母小写 QString.toLower() 3.获取字符串的字符数 QString.length() 4 ...

  6. SpringBoot 事务隔离性和传播性

    propergation 传播性 Spring中七种Propagation类的事务属性详解:  REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.  SUPPORTS ...

  7. Java基本数据类型与相应的封装类

    基本数据类型   封装类 int Integer short   Short float   Float double   Double long   Long boolean   Boolean b ...

  8. aps.net session全面介绍(生命周期,超时时间)

    Asp.Net中的Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的 ...

  9. 智课雅思词汇---二十四、形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory

    智课雅思词汇---二十四.形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory 一.总结 一句话总结: 1.形容词后缀-al? autumnal 英 [ɔː'tʌ ...

  10. javascript简单介绍总结(一)

    DOM (Document Object Model)(文档对象模型)是用于访问 HTML 元素的正式 W3C 标准.在 HTML 中,JavaScript 语句向浏览器发出的命令.语句是用分号分隔: ...