问题
https://vjudge.net/problem/UVA-10635
分析
动态规划+优化
首先是LCS,但是如果不进行优化,时间复杂度太高。 由于A或者B中不会出现重复的数字,于是,对于A[i],进行编号,同时将B转化为对应的编号,LCS转化为LIS问题。时间复杂度O(nlogn)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=70000+5,Inf=0x3f3f3f3f;
int n,p,q,ai[maxn],g[maxn],kase=0,T,t,t2;
int main(void){
scanf("%d",&T);
while(kase<T){
scanf("%d%d%d",&n,&p,&q);
memset(ai,0,sizeof(ai));
for(int i=1;i<=p+1;++i){
scanf("%d",&t);
ai[t]=i;
}
int ans=0;
fill(g,g+q+10,Inf);
for(int i=1;i<=q+1;++i){
scanf("%d",&t);
if(ai[t]){
int k=lower_bound(g+1,g+q+2,ai[t])-g;
ans=max(ans,k);
g[k]=ai[t];
}
}
printf("Case %d: %d\n",++kase,ans); //编号从1到n
}
return 0;
}