题解:
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); }