#include<iostream> #include<algorithm> #include<cstring> using namespace std ; const int N = 3010 ; int f[N][N] ;//前i个数和前j个数并且以b[j] 结尾的最长公告上升子序列 int n ; int a[N] ; int b[N] ; int main(){ cin >> n ; for(int i = 1 ; i <= n ;i ++) cin >> a[i] ; for(int i = 1 ; i <= n; i ++) cin >> b[i] ; for(int i = 1 ; i <= n ; i ++){ int S = 0 ; for(int j = 1 ; j <= n ;j ++){ f[i][j] = f[i-1][j] ; if(b[j-1] < a[i]) S = max(S , f[i-1][j-1] + 1) ;//因为我们更新的话只有a[i] == b[j] 的情况也就是说我们的a[i]是一直不变的,我们只需要判断新加入的b[j-1]能不能成为之前的最长公共上升子序列 if(a[i]==b[j]) f[i][j] = max(S,f[i][j]) ; } } int res = 0 ; for(int i = 1 ; i <= n ; i ++) res = max(res,f[n][i]) ; cout << res << endl ; }
#include<iostream> #include<cstring> #include<algorithm> using namespace std ; const int N = 3010 ; int f[N][N] ; int a[N],b[N] ; int main(){ int n ;cin >> n ; for(int i = 1 ; i <= n ;i ++) cin >> a[i] ; for(int i = 1 ; i <= n ;i ++) cin >> b[i] ; for(int i = 1 ; i <= n ;i ++){ int s = 1 ;//s记录的是以a[i]结尾的最长上升子序列的最大长度 for(int j = 1 ; j <= n ; j ++){ f[i][j] = f[i-1][j] ; if(b[j] == a[i])f[i][j] = max(f[i][j], s);//找到和这层循环的a[i]相等的b[j],就用s取更新他 if(b[j] < a[i]) s = max(s,f[i][j] + 1) ; } } int res = f[n][1] ; for(int i = 1 ; i <= n ;i ++){ res = max(res,f[n][i]) ; } cout << res << endl ; }