本题由于1e5的数据,n方的做法不再适用,但是简单的一维并不能满足动态转移。这时,我们就可以考虑引入最长上升子序列来处理
用样例来看
5
序列:3 2 1 4 5序号:1 2 3 4 5序列:1 2 3 4 5序号:3 2 1 4 5
求公共子序列,我们可以发现上面的序列是递增的。实际上,我们只是在下面找一个最长上升子序列(上面已经递增了)
(这样考虑的原因是我们收到的一个1-n的排列,每个数字只出现一次)
代码如下:
// Problem:
// P1439 【模板】最长公共子序列
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1439
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;int main(){int n;cin>>n;vector<int> a(n+1);vector<int> b(n+1);vector<int> c(n+1);//vector大法好for(int i=1;i<=n;++i) cin>>a[i],c[a[i]]=i;int x;for(int i=1;i<=n;++i) cin>>x,b[i]=c[x];vector<int> d(n+1);int cnt=0;d[0]=-1e9;//这里不会卡数据,但是建议设置一个标兵,不然后面比较会出错for(int i=1;i<=n;++i){if(b[i]>d[cnt]){d[++cnt]=b[i];}else{ //二分*upper_bound(d.begin()+1,d.begin()+1+cnt,b[i])=b[i];}}cout<<cnt<<endl;return 0;
}