题目链接:https://vjudge.net/problem/UVA-10635
题意:t组数据,第一行n,p,q,接着两个序列A[0],A[1].....A[p]。B[0],B[1],B[q]求这两行的公共子序列,单个序列中元素不重复,其中1<=A[i],B[i]<=n*n.
思路:用map建立序列A与序列B的一一映射,求B的最长递增子序列就等于求它俩的最长公共子序列
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<map>
using namespace std;
int t,n,q,p;
int A[100000],B[100000];
map<int,int>mp;
int main()
{
int x,cut;
scanf("%d",&t);
for(int carry=1;carry<=t;carry++)
{
mp.clear();
memset(A,0,sizeof(A));
cut=0;
scanf("%d%d%d",&n,&p,&q);
for(int i=0;i<=p;i++)
{
scanf("%d",&x);
mp[x]=++cut;
}
for(int i=0;i<=q;i++)
{
scanf("%d",&x);
A[i]=mp[x];
}
int r=0;
for(int i=0;i<=q;i++)
{
if(A[i]>B[r])
B[++r]=A[i];
else
B[lower_bound(B,B+r,A[i])-B]=A[i];
}
printf("Case %d: %d\n",carry,r);
}
}