白书P66页上的题目。。
关键:
把LCS转化为LIS ,,
然后用 nlogn 的LIS实现。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=250*250;
int S[maxn],num[maxn],g[maxn];
int d[maxn];
const int INF=10000000;
int main(){
int t;
scanf("%d",&t);
int cas=0;
while(t--){
int n,n1,n2;
scanf("%d%d%d",&n,&n1,&n2);
memset(num,0,sizeof(num));
memset(S,0,sizeof(S));
memset(d,0,sizeof(d));
for(int i=1;i<=n1+1;++i){
int x;
scanf("%d",&x);
num[x]=i;
}
int tol=0;
for(int i=1;i<=n2+1;++i){
int x;
scanf("%d",&x);
if(num[x])S[++tol]=num[x];
}
for(int i=1;i<=n*n;++i)g[i]=INF;
int ans=0;
for(int i=1;i<=tol;++i){
int k=lower_bound(g+1,g+1+n*n,S[i])-g;
d[i]=k;
g[k]=S[i];
ans=max(ans,d[i]);
}
printf("Case %d: %d\n",++cas,ans);
}
}