最长公共子序列
#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; }