最长公共子序列
#include<iostream>
#define maxn 100010
using namespace std;
int A[maxn],B[maxn],C[maxn],f[maxn],f1[2333][2333];
int main(){
将A序列一一映射成1,2,3...n,便等价于求B序列的最长上升子序列长度.
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>A[i];
for(int i=1;i<=n;i++)cin>>B[i];
O(n^2)求一般情况
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(A[i]==B[j])f1[i][j]=f1[i-1][j-1]+1;
else f1[i][j]=max(f1[i-1][j],f1[i][j-1]);
cout<<f1[n][n];cout<<endl;
O(nlogn)求排列情况
for(int i=1;i<=n;i++)C[A[i]]=i;
for(int i=1;i<=n;i++)B[i]=C[B[i]];
f[1]=B[1];int lon=1;
for(int i=2;i<=n;i++){
if(B[i]>f[lon])f[++lon]=B[i];
else{
int l=1,r=lon;
while(l<r){
int mid=(l+r)>>1;
if(f[mid]<B[i])l=mid+1;
else r=mid;
}
f[l]=B[i];
}
}
cout<<lon;
return 0;
}
京公网安备 11010502036488号