1264: [AHOI2006]基因匹配Match DP+树状数组
2016-03-16 08:47
309 查看
朴素的LCS是O(n2)O(n^2)的,考虑只有B[i]=A[j]B[i]=A[j]时才会使答案+1+1,那么由于本题的特殊性质,对于某一个B[i]B[i],与之相等的A[j]A[j]只有55个,那么我们可以用B[i]B[i]来更新这五个位置的答案,可以用树状数组维护前缀最值。
[code]#include<iostream> #include<cstdio> #define N 100005 using namespace std; int tree ; int a [6]; int f ; int n,ans; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } int query(int x) { int tmp=0; for (int i=x;i;i-=i&-i) tmp=max(tmp,tree[i]); return tmp; } void update(int x,int val) { for (int i=x;i<=n;i+=i&-i) tree[i]=max(tree[i],val); } int main() { n=read()*5; for (int i=1;i<=n;i++) { int x=read(); a[x][++a[x][0]]=i; } for (int i=1;i<=n;i++) { int x=read(); for (int j=5;j;j--) { int pos=a[x][j]; f[pos]=max(f[pos],query(pos-1)+1); update(pos,f[pos]); ans=max(ans,f[pos]); } } cout << ans << endl; return 0; }
相关文章推荐
- Web前端优化小结
- postgresql 导出脚本
- HDOJ 2073 无限的路 (DFS)
- ASP.NET中using的用法三则
- weChat聊天发送图片带有小尖角的实现
- C语言 右左法则
- JeeSite 快速开发 单表代码生成
- php关联数组通过key获取value
- 赫夫曼树的构建、编码、译码解析
- jQuery.Autocomplete实现自动完成功能(详解)
- DP(3)
- IOS开发之 一个实例解析 录音
- Codeforces Round #331 (Div. 2) A. Wilbur and Swimming Pool (判断组成最大矩形)
- NHibernate-2.1.2 简单增删查改操作
- MySql之char与varchar
- Java获取来访者IP
- poj 1328 Radar Installation 【贪心】【区间选点问题】
- 创建oracle用户
- iOS开发之 音频播放
- Tyk API网关介绍及安装说明