题意
输入 a , b a,b a,b数组各 n n n个数,求最长公共子序列。
分析
先用桶做一个映射,然后每次找比他第一个比他大的位置放进去,求min。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100001],b[100001],m[100001],f[100001],len,n;
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=1; i<=n; i++)
{
scanf("%d",&b[i]);
m[b[i]]=i;
}
f[0]=0;
for(int i=1; i<=n; i++)
{
if(m[a[i]]>f[len])
{
f[++len]=m[a[i]];
}
else
{
int k=lower_bound(f+1,f+len+1,m[a[i]])-f;
f[k]=min(m[a[i]],f[k]);
}
}
cout<<len;
return 0;
}