1264: [AHOI2006]基因匹配Match(动态规划神题)
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(动态规划神题)的更多相关文章
- BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组
题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...
- 1264: [AHOI2006]基因匹配Match
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 982 Solved: 635[Submit][S ...
- 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: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我 ...
- BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1264 题意概括 给出两个长度为5*n的序列,每个序列中,有1~n各5个. 求其最长公共子序列长度. ...
- bzoj 1264 [AHOI2006]基因匹配Match dp + 树状数组
思路:好难想啊, 考虑到应该从每个数字只有5个数字下手, 但是不知道到底该怎么写.. 首先我们将第一个串按数字的种类分类, 每一类里面有5个, 然后将第二个串里面的数字一个一个加,如果一个加入的第 i ...
随机推荐
- 2015 Multi-University Training Contest 6 hdu 5358 First One
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- activity生命周期的onPause和onStop
搞了这么长时间的android开发,却对一些基础的东西一直模棱两可...就比方这个onPause和onStop. 假设从一个界面,跳到还有一个界面,那么是调用哪个呢? 经过我的实验.搞清楚了.onPa ...
- HDU5233
Gunner II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- m_Orchestrate learning system---十二、为什么thinkphp验证场景里面的多个属性之间是逗号
m_Orchestrate learning system---十二.为什么thinkphp验证场景里面的多个属性之间是逗号 一.总结 一句话总结:因为是数组啊 1 protected $scene ...
- m_Orchestrate learning system---十三、thinkphp的验证器支持多语言么
m_Orchestrate learning system---十三.thinkphp的验证器支持多语言么 一.总结 一句话总结:支持,不仅验证器支持,其它的插件应该都支持 不仅thinkphp支持多 ...
- Spark技术在京东智能供应链预测的应用——按照业务进行划分,然后利用scikit learn进行单机训练并预测
3.3 Spark在预测核心层的应用 我们使用Spark SQL和Spark RDD相结合的方式来编写程序,对于一般的数据处理,我们使用Spark的方式与其他无异,但是对于模型训练.预测这些需要调用算 ...
- [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)
题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...
- QT笔记 -- (5) 实现QWidget的paintEvent函数,在widget上画背景图形
如图,想在界面上画个弧线和直线,于是继承QWidget得到类MainContainer,并实现了paintEvent函数.然后用类MainContainer定义centralWidget. MainC ...
- SpringBoot学习笔记(2)----配置文件取值
今天介绍三种配置文件手动取值的方式: springboot配置文件信息保存在application.properties中,默认可以spring.开头的进行spring进行一些常用参数的配置,但是很多 ...
- Collections库使用
Date: 2019-05-27 Author: Sun Collections库 Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collec ...