1. 程式人生 > >[題解]洛谷P1439 【模板】最長公共子序列

[題解]洛谷P1439 【模板】最長公共子序列

序列 printf %d span pac namespace int turn esp

原題

原題

思路

將第一個序列依次從左到右標號,然後映射到第二個序列中

因為第一個序列標號只上升的所以問題就轉化為序列2標號後的最長上升子序列

代碼

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100010;

int n,a[MAXN],b[MAXN];
int c[MAXN];
int stack[MAXN];
int ans=1;
int qwq[MAXN];

int main(){
    scanf("%d",&n);
    
for(int i=1;i<=n;i++){ scanf("%d",&a[i]); qwq[a[i]]=i; } for(int i=1;i<=n;i++){ scanf("%d",&b[i]); c[i]=qwq[b[i]]; } stack[1]=c[1]; for(int i=2;i<=n;i++){ if(stack[ans]<c[i]){ stack[++ans]=c[i]; }
else{ stack[lower_bound(stack+1,stack+ans+1,c[i])-stack]=c[i]; } } printf("%d",ans); return 0; }

[題解]洛谷P1439 【模板】最長公共子序列