Java
import java.util.Scanner;
public class Main {
static final int N = 210, M = 10010;
static int n, m, l;
static int[] p = new int[N];
static int[] s = new int[M];
static int[][] f = new int[N][M];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 1; i <= m; i++) {
p[i] = sc.nextInt();
}
l = sc.nextInt();
for (int i = 1; i <= l; i++) {
s[i] = sc.nextInt();
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= l; j++) {
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
if (p[i] == s[j]) {
f[i][j] = Math.max(f[i][j], f[i][j - 1] + 1);
}
}
}
System.out.println(f[m][l]);
}
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210, M = 10010;
int n, m, l;
int p[N], s[M];
int f[N][M];
int main() {
cin >> n;
cin >> m;
for (int i = 1; i <= m; i++) cin >> p[i];
cin >> l;
for (int i = 1; i <= l; i++) cin >> s[i];
for (int i = 1; i <= m; i++)
for (int j = 1; j <= l; j++) {
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
if (p[i] == s[j]) f[i][j] = max(f[i][j], f[i][j - 1] + 1);
}
cout << f[m][l] << endl;
return 0;
}