[题解]洛谷P1439 【模板】最长公共子序列
原题
思路
将第一个序列依次从左到右标号,然后映射到第二个序列中
因为第一个序列标号只上升的所以问题就转化为序列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; }
本篇文章为SHINE_GEEK原创,转载请注明来源!
-------------------------------------
签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
-------------------------------------
written_by:SHINE_GEEK
blog_addr:www.cnblogs.com/sjrb
-------------------------------------
签名:自己选的路,跪着也要走完;理想的实现,需要不懈奋斗!
-------------------------------------