题目连接:
题目解析:
最长公共子序列。如果直接用LCS,时间复杂度不允许
注意到A,B两个序列中所有元素不同。因此可以把A中元素重新编号为1~p+1,并依此相应调整B中元素编号(如果在A中没出现过可以直接删除)。
之后求新的B序列的LIS即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=250*250;
int s[N],g[N],d[N],num[N];
int main()
{
int T;
cin>>T;
for(int cas=1;cas<=T;cas++)
{
int N,p,q,x,n=0;
cin>>N>>p>>q;
memset(num,0,sizeof(num));
for(int i=1;i<=p+1;i++)
{
scanf("%d",&x);
num[x]=i;
}
for(int i=0;i<q+1;i++)
{
scanf("%d",&x);
if(num[x]) s[n++]=num[x];
}
for(int i=1;i<=n;i++) g[i]=1000000000;
int ans=0;
for(int i=0;i<n;i++)
{
int k=lower_bound(g+1,g+n+1,s[i])-g;
d[i]=k;
g[k]=s[i];
ans=max(ans,d[i]);
}
printf("Case %d: %d\n",cas,ans);
}
return 0;
}