bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))

Posted znsbc-13

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))相关的知识,希望对你有一定的参考价值。

基因匹配Match

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
 
 

题目描述

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

DNA序列的每一种碱基在该序列中正好出现5次!这样如果一个DNA序列有N种不同的碱基构成,那么它的长度一定是5N。 卡卡醒来后向可可叙述了这个奇怪的梦,而可

可这些日子正在研究生物信息学中的基因匹配问题,于是他决定为这个奇怪星球上的生物写一个简单的DNA匹配程序。 为了描述基因匹配的原理,我们需要先定义子序

列的概念:若从一个DNA序列(字符串)s中任意抽取一些碱基(字符),将它们仍按在s中的顺序排列成一个新串u,则称u是s的一个子序列。对于两个DNA序列s1和

s2,如果存在一个序列u同时成为s1和s2的子序列,则称u是s1和s2的公共子序列。 卡卡已知两个DNA序列s1和s2,求s1和s2的最大匹配就是指s1和s2最长公共子序列的

长度。 [任务] 编写一个程序: ? 从输入文件中读入两个等长的DNA序列; ? 计算它们的最大匹配; ? 向输出文件打印你得到的结果。

输入格式

输入文件中第一行有一个整数N,表示这个星球上某种生物使用了N种不同的碱基,以后将它们编号为1…N的整数。 以下还有两行,每行描述一个DNA序列:包含5N个

1…N的整数,且每一个整数在对应的序列中正好出现5次。

输出格式

输出文件中只有一个整数,即两个DNA序列的最大匹配数目。

样例

样例输入

2
1 1 2 2 1 1 2 1 2 2
1 2 2 2 1 1 2 2 1 1

样例输出

7

数据范围与提示

60%的测试数据中:1<=N <= 1 000

100%的测试数据中:1<=N <= 20 000

lcs(nlogn)直接模板搞

具体操作lcs转lis

因为lis可以nlogn

所以lcs可以nlogn

别的博客写的什么树状数组

要是真到考试我绝对想不到这种做法

我太菜了

技术图片
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define A 200001
 4 using namespace std;
 5 ll id=0,num=0,n,a[A],b[A],f[A],lis[A],o[A+A+A+A+A],len=0;
 6 vector <ll> fl[A];
 7 inline ll read()
 8 
 9     ll f=1,x=0;
10     char ch=getchar();
11     while(ch<0||ch>9)
12     
13         if(ch==-) f=-1;
14         ch=getchar();
15     
16     while(ch>=0&&ch<=9)
17     
18         x=(x<<1)+(x<<3)+(ch^48);
19         ch=getchar();
20     
21     return f*x;
22 
23 int main()
24 
25     n=read();n*=5;
26         for(ll i=1;i<=n;i++)
27         a[i]=read();b[n-i+1]=a[i];
28     for(ll i=1;i<=n;i++)
29     
30         b[i]=read();
31         fl[b[i]].push_back(i);
32     
33     for(ll i=1;i<=n;i++)
34     
35         ll nu=4;
36         while(nu>=0)
37             
38             o[++num]=fl[a[i]][nu];
39             nu--;
40         
41     
42     for(ll i=1;i<=num;i++)
43     
44         if(len==0||lis[len]<o[i])
45             lis[++len]=o[i];
46         else 
47         
48             ll p=lower_bound(lis,lis+len,o[i])-lis;
49             lis[p]=o[i];
50         
51     
52     cout<<len<<endl;
53 
View Code

 

以上是关于bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))的主要内容,如果未能解决你的问题,请参考以下文章

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

BZOJ 1264 [AHOI2006]基因匹配Match

BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组

bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

[BZOJ1264][AHOI2006]基因匹配Match(DP + 树状数组)

BZOJ1264[AHOI2006]基因匹配Match DP+树状数组