bzoj1264

题解:

60分的dp还是很好想的

首先观察dp

只有在相同的时候才会转移

所以我们可以维护5个相同的点

然后再加上树状数组

代码:

#include<bits/stdc++.h>
const int N=200005;
using namespace std;  
int n,ans,a[N],b[N],c[N],f[N],pos[N][6];  
void insert(int x,int y)  
{  
    for (;x<N;x+=x&-x)c[x]=max(c[x],y);  
}  
int sum(int x)  
{  
    int re=0;  
    for (;x;x-=x&-x)re=max(re,c[x]);  
    return re;  
}  
int main()  
{    
    scanf("%d",&n);  
    for (int i=1;i<=n*5;i++)  
     { 
        scanf("%d",&a[i]);  
        pos[a[i]][++pos[a[i]][0]]=i;  
     }  
    for (int i=1;i<=n*5;i++)scanf("%d",&b[i]);  
    for (int i=1;i<=n*5;i++)  
     for (int j=5;j;j--)  
      {  
        int k=pos[b[i]][j];  
        f[k]=max(f[k],sum(k-1)+1);  
        insert(k,f[k]);  
        ans=max(ans,f[k]);  
      }  
    printf("%d",ans);  
}  
原文地址:https://www.cnblogs.com/xuanyiming/p/8625928.html