您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: