0%

P1439 【模板】最长公共子序列

思路讲解

https://www.luogu.com.cn/article/63o898db

如果说一个序列是1,2,3,4,5,……,N,还有一个序列无序,那么其实就选一个LIS就行。

那么现在前面这个序列不是有序的,但前面这个序列的标号是有序的,这个时候怎么搞?其实我们就定义新的顺序为A[1]<A[2]<A[3]……<A[N],就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
scanf("%lld",&N);
FOR(i,1,N) {scanf("%lld",&A[i]);posA[A[i]]=i;}
FOR(i,1,N) {scanf("%lld",&B[i]);}
vector<ll> dp;
FOR(i,1,N){
if(dp.empty()) dp.pb(posA[B[i]]);
else{
vector<ll>::iterator it=lower_bound(all(dp),posA[B[i]]);
if(it==dp.end()) dp.pb(posA[B[i]]);
else dp[it-dp.begin()]=posA[B[i]];
}
}
printf("%d\n",SZ(dp));

AC代码

https://www.luogu.com.cn/record/219257679

心路历程(WA,TLE,MLE……)