最长公共子序列(进阶版)
题解 : 将一个序列离散化,离散化只有变成1 2 3 4 5 ......
则要求最长公共子序列就会转化为求最长上升子序列,按照进阶版的二分进行查找添加,更新值就会成为结果。注意题目中的1-n的排列。
#include <map>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int MAXN = 1e5+5;
int a[MAXN],b[MAXN];
int main(){
int N;
scanf("%d",&N);
map<int,int>m;
m.clear();
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
m[a[i]]=i+1;
}
for(int i=0;i<N;i++){
scanf("%d",&b[i]);
b[i]=m[b[i]];
}
vector<int>v;
v.push_back(b[0]);
for(int i=1;i<N;i++){
int l=0,r=v.size();
if(b[i]>v[v.size()-1])
v.push_back(b[i]);
else{
while(l<r){
int mid=(l+r)/2;
if(b[i]>v[mid])l=mid+1;
else r=mid;
}
v[l]=b[i];
}
}
printf("%d\n",v.size());
return 0;
}