最长公共子序列

感觉这题o(n^2)  比较好想,直接dp就好;

后来数据是100000的时候就有点儿懵逼。。。

但是可以仔细想一想,就是对第一个序列中每一个元素记录相对位置(第一个数字是1,第二个数字是2,。。。。),这样处理第二个的时候,只需要求一个最长上升子序列就好!!!

然后求最长上升子序列,手写二分也可以,然而懒一下lower_bound即可.

#include
#include
#include
#include 
using namespace std;
int r[101000],a[101000],f[101000];
int main(){
	int n;
	cin>>n; 
	for(int i=1;i<=n;i++){
		int k;
		cin>>k;
		r[k]=i;
	}
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++){
		int k;
		cin>>k;
		*lower_bound(f+1,f+n+1,r[k])=r[k];
	} 
	cout<

 

你可能感兴趣的:(最长公共子序列)