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. iconfont的使用

    首先你要有一个图标库的账号,我们使用的是阿里矢量图标库,其次你要有一套已经设计好的图标原图.如果你具备了这些,就可以和我一起看iconfont的使用姿势了. 写在前面 不结合其他矢量库或UI框架一起使 ...

  2. DATEDIFF() 返回2个日期之间的间隔

    SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate 解释: 第一个参数 day 表示 返回2个日期间隔的 个间隔类型 是 日期:结果 ...

  3. Spring 之通过 XML 装配 bean

    1.关于 使用传统标签还是 c- p- 命名空间定义的标签, 我的观点是能用  c- p- 命名空间定义的标签 就不用 传统标签(这样会比较简洁... 2.强依赖使用构造器注入,可选性依赖使用属性注入 ...

  4. CF961G Partitions(第二类斯特林数)

    题目 CF961G 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 相信大家能得出一个一眼式:\[Ans=\sum\limits_{i=1}^n w_i\sum\limi ...

  5. 会话控制Cookie的应用

    Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户端对服务器的请求中发回它.PHP透明地支持HTTP Cookie.可以利用他在远程浏览器端存储数据并以此来跟 ...

  6. react-native navigation的学习与使用

    在很久之前,RN中文网说推荐用react-navigation替代navigator作为新的导航库,从RN 0.43版本开始,官方就已经停止维护Navigator了,所以强烈建议大家迁移到新的reac ...

  7. Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...

  8. EF Code-First 学习之旅 数据库初始化

    1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...

  9. spring半自动代理

    1.被代理类接口Person.java package com.xiaostudy; /** * @desc 被代理类接口 * * @author xiaostudy * */ public inte ...

  10. MySQL安装配置教程

    环境:Windows 7 旗舰版 64位MySQL版本:mysql-5.5.14-winx64MySQL下载地址:http://dev.mysql.com/downloads/installer/ 1 ...