P1439 【模板】最长公共子序列
传送门
题目描述
给出1-n的两个排列P1和P2,求它们的最长公共子序列。
输入输出格式
输入格式:第一行是一个数n,
接下来两行,每行为n个数,为自然数1-n的一个排列。
输出格式:一个数,即最长公共子序列的长度
输入输出样例
说明
【数据规模】
对于50%的数据,n≤1000
对于100%的数据,n≤100000
10分代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int c[100005],n,a[100050],b[100050],rank[100050],f[100050],len; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; rank[a[i]]=i; } for(int i=1;i<=n;i++) cin>>b[i]; for(int i=1;i<=n;i++) { if(rank[b[i]]>c[len]) { c[++len]=rank[b[i]]; f[i]=len; } else { int j=lower_bound(c+1,c+n+1,rank[b[i]])-c; c[j]=rank[b[i]]; f[i]=j; } } cout<<len; }
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int c[100005],n,a[100050],b[100050],rank[100050],f[100050],len; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; rank[a[i]]=i; } for(int i=1;i<=n;i++) cin>>b[i]; for(int i=1;i<=n;i++) { if(rank[b[i]]>c[len]) { c[++len]=rank[b[i]]; f[i]=len; } else { int j=lower_bound(c+1,c+len+1,rank[b[i]])-c; c[j]=rank[b[i]]; f[i]=j; } } cout<<len; }