#include<iostream> using namespace std ; const int N=3030; int n; int a[N]; int b[N]; int f[N][N]; //f[i][j] //表示所有由第一个序列的前i个字母,和第二个序列的前j个字母构成的, //且以b[j]结尾的公共上升子序列 int main() { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) scanf("%d",&b[i]); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { //不包含a[i]的公共上升子序列 f[i][j]=f[i-1][j]; //包含的 if(a[i]==b[j]) { f[i][j]=max(f[i][j],1); for(int k=1; k<j; k++) if(b[k]<b[j]) f[i][j]=max(f[i][j],f[i][k]+1); } } int res=0; for(int i=1; i<=n; i++) res=max(res,f[n][i]); printf("%d\n",res); return 0; }