题目描述
给出1-n的两个排列P1和P2,求它们的最长公共子序列。
输入输出格式
输入格式:第一行是一个数n,
接下来两行,每行为n个数,为自然数1-n的一个排列。
输出格式:一个数,即最长公共子序列的长度
输入输出样例
输入样例#1:
5 3 2 1 4 5 1 2 3 4 5
输出样例#1:
3
说明
【数据规模】
对于50%的数据,n≤1000
对于100%的数据,n≤100000
题目描述
给出1-n的两个排列P1和P2,求它们的最长公共子序列。
输入输出格式
输入格式:
第一行是一个数n,
接下来两行,每行为n个数,为自然数1-n的一个排列。
输出格式:
一个数,即最长公共子序列的长度
输入输出样例
输入样例#1:
5 3 2 1 4 5 1 2 3 4 5
输出样例#1:
3
说明
【数据规模】
对于50%的数据,n≤1000
对于100%的数据,n≤100000
把一个映射到另一个上,求lis。
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n,m,mp[N],d[N],a[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
mp[x]=i;
}
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[i]=mp[x];
}
for(int i=1;i<=n;i++)
if(d[m]<a[i])
d[++m]=a[i];
else
d[lower_bound(d+1,d+m+1,a[i])-d]=a[i];
printf("%d\n",m);
return 0;
}