【模板】最长公共子序列
程序员文章站
2022-03-09 19:48:44
...
算法又被鸽鸽鸽了。。。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
template<typename T> void chkmin(T &x,T y){x=x<y?x:y;}
template<typename T> void chkmax(T &x,T y){x=x>y?x:y;}
template<typename T> void read(T &x){scanf("%d",&x);}
template<typename T> void write(T x){printf("%d\n",x);}
int co[2][100010];int no[100010];
int dp[100010];int fdp[100010];
int main(){
int n;read(n);
rep(i,1,n){read(co[0][i]);}
rep(i,1,n){int x;read(x);co[1][x]=i;}
rep(i,1,n){no[i]=co[1][co[0][i]];}
memset(fdp,0x3f,sizeof(fdp));
dp[1]=1;int len=1;fdp[1]=no[1];int ans=1;
rep(i,2,n){
dp[i]=1;
rep2(j,len,1){
if(fdp[j]<no[i]){
dp[i]=j+1;break;
}
}
chkmin(fdp[dp[i]],no[i]);chkmax(len,dp[i]);
chkmax(ans,dp[i]);
}
write(ans);
return 0;
}