1264: [AHOI2006]基因匹配Match

题目:传送门

简要题意:

  给出两个序列。每个序列都由n种不同的数字组成,保证每个序列种每种数字都会出现5次(位置不一定一样),也就是序列长度为5*n啦。

  求这两个序列的最长公共子序列。

题解:

  假的(nlogn)最长公共子序列算法

  本蒟蒻看完题:

    woc!大水题,这不是就是动态规划求最长公共子序列吗~

  看完数据范围...ORZ那么大!!!最长公共子序列的基础算法要(n^2)...完了...不会...瞎搞???

  这么皮,怎么破!

  tkj神犇:so easy~~(orz...%%%)

  好的,%完师兄...

  真正的正解:

  本题的突破口其实就在于每种数只出现5次。

  那么我们可以先把第一个数列种每种数出现的位置用pos[]记录,然后放到第二个数列。

  举个栗子,就拿样例来说:

  第一个:1 1 2 2 1 1 2 1 2 2

  那么pos[1]=1,2,5,6,8       pos[2]=3,4,7,9,10

  然后放回第二个数列:1 2 2 2 1 1 2 2 1 1

  用一个新的s[]记录新数列,s[]=8 6 5 2 1,10 9 7 4 3, 10 9 7 4 3...(以此类推)

  那么我们只需要求出这个新数列的最长上升子序列就ok啦~(原理十分简单,模拟一下就ok)

  这里还有一个小细节需要注意:不难发现,我们更新新数列的时候每种数字的位置都是按倒序放的,这样就可以避免在第二个数列中的一个位置重复选择(重点)。

  好啦,这样子时间复杂度就为(nlongn)

  但是...是假的...因为要是每种数不止出现五次...那就ORZ吧!

AC代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x)x=read();
using namespace std;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node1
{
int pos[],id;
node1(){id=;}
}a[];
struct node2
{
int pos[],id;
node2(){id=;}
}b[];
int s[];
int n,N,len;
bool cmp(int n1,int n2)
{
return n1>n2;
}
int f[];//表示长度为i的最长上升子序列的末尾(最小)
int erfen(int x)
{
int l=,r=len,ans=;
while(l<=r)
{
int mid=(l+r)/;
if(f[mid]>=s[x])
{
ans=mid;
r=mid-;
}
else l=mid+;
}
return ans;
}
int main()
{
qread(n);
for(int i=;i<=n*;i++)
{
int x;qread(x);
a[x].id++;
a[x].pos[a[x].id]=i;
}
for(int i=;i<=n;i++)sort(a[i].pos+,a[i].pos++);
for(int i=;i<=n*;i++)
{
int x;qread(x);
int k;
k=a[x].id;
for(int j=i*-;j<=i*;j++)
{
s[j]=a[x].pos[k];
k--;
}
}
N=n*;
f[]=s[];len=;
for(int i=;i<=N;i++)
{
if(s[i]>f[len])
f[++len]=s[i];
else
{
int j=erfen(i);
f[j]=s[i];
}
}
printf("%d\n",len);
return ;
}

1264: [AHOI2006]基因匹配Match(动态规划神题)的更多相关文章

  1. BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组

    题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...

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

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

  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: [AHOI2006]基因匹配Match (树状数组优化dp)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...

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

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1264 题意概括 给出两个长度为5*n的序列,每个序列中,有1~n各5个. 求其最长公共子序列长度. ...

  9. bzoj 1264 [AHOI2006]基因匹配Match dp + 树状数组

    思路:好难想啊, 考虑到应该从每个数字只有5个数字下手, 但是不知道到底该怎么写.. 首先我们将第一个串按数字的种类分类, 每一类里面有5个, 然后将第二个串里面的数字一个一个加,如果一个加入的第 i ...

随机推荐

  1. 拿到offer过后--大学最后时光最想做的那十件事

    昨天--2014.10.26,历史性的一刻,激动的签了欢聚时代(YY)的前端开发offer,工作地点是我喜欢的珠海(仅仅由于那边有我所向往的海还有自行车队,如今想想都乐开怀了,绕着海边骑单车的感觉真妙 ...

  2. 匿名訪问之(一)web application级别

    假设用SharePoint做一个对外开放的公共站点,比方公司展示站点.那么浏览站点的人不须要注冊和登陆.就应该能看到内容.这个时候就须要对站点开启匿名訪问. SharePoint的匿名訪问是从上而下的 ...

  3. MySQL优化之——集群搭建步骤具体解释

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46833179 1 概述 MySQL Cluster 是MySQL 适合于分布式计算 ...

  4. Android提高UI性能技巧

    提高UI性能的方法事实上有非常多在实际的开发中都已经用到了,在此做一下总结. 1.降低主线程的堵塞时间 若一个操作的耗时较长(超过5秒),我们应该将其放入后台线程中运行.仅仅在须要改动UI界面时通知主 ...

  5. 在openwrt上编译一个最简单的ipk包

    1 什么是opkg Opkg 是一个轻量快速的套件管理系统,目前已成为 Opensource 界嵌入式系统标准.常用于路由.交换机等嵌入式设备中,用来管理软件包的安装升级与下载. opkg updat ...

  6. 高斯滤波及高斯卷积核C++实现

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,在图像处理的降噪.平滑中应用较多,特别是对抑制或消除服从正态分布的噪声非常有效. 高斯滤波的过程其实就是对整幅图像进行加权平均操作的过程.滤波后图像上每 ...

  7. (转载) Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题

    Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题 标签: scrollviewandroid滑动嵌套 2015-07-16 17:24 1112 ...

  8. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

    求解所有两点间的最短路问题叫做任意两点间的最短路问题. 可以用动态规划来解决, d[k][i][j] 表示只用前k个顶点和顶点i到顶点j的最短路径长度. 分两种情况讨论: 1.经过顶点k,  d[k] ...

  9. 查看锁表进程SQL语句

    查看锁表进程SQL语句   set pagesize 999 set line180 col ORACLE_USERNAME for a18 col OS_USER_NAME for a18 col ...

  10. 中级前端工程师要掌握的JavaScript 技巧

    1.判断对象的数据类型 2.Es5实现数组map方法 3.使用reduce实现数组map方法 4.ES5 实现数组filter方法 5.使用reduce实现filter方法 6.ES5 实现数组som ...