代码如下
#include<bits/stdc++.h>
using namespace std;
#define int long long
int arr1[600], arr2[600], dp[520][520],fnd[520][520],back[520][520], n, m, ans,jj;
stack<int> s;
signed main()
{
cin >> n; for (int i = 1; i <= n; i++) { cin >> arr1[i]; }
cin >> m; for (int i = 1; i <= m; i++) { cin >> arr2[i]; }arr2[0] = -1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (arr1[i] == arr2[j]) {
fnd[i][j] = arr2[j];
for (int k = 0; k < j; k++)
if (arr2[j] > arr2[k]) {
back[i][j] = ((dp[i - 1][k] + 1) > dp[i][j] ? k : back[i][j]);
dp[i][j] = max(dp[i - 1][k] + 1, dp[i][j]);
}
}
else {
dp[i][j] = dp[i - 1][j];
fnd[i][j] = fnd[i - 1][j];
back[i][j] = back[i - 1][j];
}
if (i == n) {
ans = max(ans, dp[i][j]);
if (ans == dp[i][j]) { jj = j; }
}
}
}
cout << ans<<endl;
while (dp[n][jj]) {
s.push(fnd[n][jj]);
jj = back[n][jj];
n--;
}
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}
return 0;
}