【DP+树状数组】BZOJ1264-[AHOI2006]基因匹配Match
【题目大意】
给定n个数和两个长度为n*5的序列,两个序列中的数均有1..n组成,且1..n中每个数恰好出现5次,求两个序列的LCS。
【思路】
预处理每个数字在a[i]中出现的五个位置。f[i]示以a[i]为末尾的最长公共子串(*这样就可以避免讨论交叉)。
依次处理b[i],对于每个b[i]找到a[i]中的五个位置转移,用nowp表示,转移很简单:f[nowp]=max(f[nowp],query(nowp-1)+1),这里需要维护前缀最大值。
才知道前缀最大值可以用BIT来维护。
不过要注意的是,一定要从5 downto 1。为什么呢?由于nowp是升序排列的,如果从最小的开始,那么后来的f转移时可能会把先前求出来的f算进去,然而事实上它们对应着的是同一个b[i]。
所以要从大到小。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=+;
int n;
int a[*MAXN],b[*MAXN],e[*MAXN],f[*MAXN];
//f[i]表示以a[i]为末尾的最长公共子串,这样就可以避免讨论交叉
int pos[MAXN][];
int ans=; int lowbit(int x)
{
return (x&(-x));
} int query(int x)
{
int ret=;//这里初值必须设为0而不是-1
while (x>) ret=max(ret,e[x]),x-=lowbit(x);
return ret;
} void update(int x,int delta)
{
while (x<=*n) e[x]=max(e[x],delta),x+=lowbit(x);
} void init()
{
memset(e,,sizeof(e));
memset(f,,sizeof(f));
memset(a,,sizeof(a));
scanf("%d",&n);
for (int i=;i<=*n;i++)
{
scanf("%d",&a[i]);
pos[a[i]][++pos[a[i]][]]=i;
}
for (int i=;i<=*n;i++) scanf("%d",&b[i]);
} void dp()
{
for (int i=;i<=*n;i++)
for (int j=;j>=;j--)//这里一定要从后往前
{
int nowp=pos[b[i]][j];
f[nowp]=max(f[nowp],query(nowp-)+);
update(nowp,f[nowp]);
ans=max(ans,f[nowp]);
}
printf("%d\n",ans);
} int main()
{
init();
dp();
return ;
}
【DP+树状数组】BZOJ1264-[AHOI2006]基因匹配Match的更多相关文章
- bzoj1264 [AHOI2006]基因匹配Match 树状数组+lcs
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1255 Solved: 835[Submit][ ...
- BZOJ1264: [AHOI2006]基因匹配Match
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 541 Solved: 347[Submit][S ...
- BZOJ1264 [AHOI2006]基因匹配Match 动态规划 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1264 题意概括 给出两个长度为5*n的序列,每个序列中,有1~n各5个. 求其最长公共子序列长度. ...
- [BZOJ1264][AHOI2006]基因匹配Match(DP + 树状数组)
传送门 有点类似LCS,可以把 a[i] 在 b 串中的位置用一个链式前向星串起来,由于链式前向星是从后往前遍历,所以可以直接搞. 状态转移方程 f[i] = max(f[j]) + 1 ( 1 &l ...
- BZOJ1264 [AHOI2006]基因匹配Match 【LCS转LIS】
题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\( ...
- BZOJ1264——[AHOI2006]基因匹配Match
1.题意,求最长公共子序列,每个数字在序列中都出现5次 2.分析:最长公共子序列的标准解法是dp,$O(n^2)$过不了的,然后我们发现判断哪两个位置优化的地方用$5n$就可以搞定了,那么我们用BIT ...
- 【BZOJ1264】[AHOI2006]基因匹配Match DP+树状数组
[BZOJ1264][AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而 ...
- 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 树状数组+DP
1264: [AHOI2006]基因匹配Match Description 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
随机推荐
- 24、redis中的sentinel的作用?
redis中的sentinel的作用? Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Re ...
- AndroidStudio 添加Selector文件,在res文件夹下添加文件夹
在res文件夹下添加文件夹: 添加Selector文件:
- idea 调试远程tomcat
# ----- Execute The Requested Command ----------------------------------------- JAVA_OPTS="-age ...
- python中range函数与列表中删除元素
一.range函数使用 range(1,5) 代表从1到4(不包含5),结果为:1,2,3,4 ,默认步长为1 range(1,5,2) 结果为:1, 3 (同样不包含5) ,步长为2 ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- clearcase command (windows 常用的几个)
command 1. setview 指定某个view你可以操作,否则你将看不到文件,ls,cd 等其它命令无效 setview viewname 2. rename branch type na ...
- [New learn]AutoLayout调查基于IB
代码:https://github.com/xufeng79x/AutoLayout-IB 1.简介 Autolayout旨在解决不同高宽度的屏幕下的显示问题,通过增加给控件增加约束来达到不同屏幕间的 ...
- [转]6个HelloWorld
原文地址:点击打开链接 转这个帖子,是因为看了这个帖子使我明白了一个道理:一旦你发散自己的思维,激发自己的创意,就会发现原来编程是这么的好玩. 原文标题为<6个变态的C语言Hello World ...
- 在JAVASCRIPT中构建一个复杂的对象,并用JSON进行转换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 在k8s中安装flannel的故障解决: Failed to create SubnetManager: error retrieving pod spec for : the server does not allow access to the requested resource
花了一个上午来追踪问题,k8s都反复新建了十多次,docker都重启了几次.(一次显示不有获取磁盘空间,重启docker,清空存储解决) 在用kubeadm安装容器化的几个组件时,flannel组件死 ...