题目描述
给定一个长度为 NN 数组 aa 和一个长度为 MM 的数组 bb。
请你求出它们的最长公共子序列长度为多少。
输入描述
输入第一行包含两个整数 N,MN,M,分别表示数组 aa 和 bb 的长度。
第二行包含 NN 个整数 a_1,a_2,...,a_na1,a2,...,an。
第三行包含 MM 个整数 b_1,b_2,...,b_nb1,b2,...,bn。
1\leq N,M \leq 10^31≤N,M≤103,1\leq a_i,b_i \leq 10^91≤ai,bi≤109。
输出描述
输出一行整数表示答案。
输入输出样例
示例 1
输入
5 6
1 2 3 4 5
2 3 2 1 4 5
输出
4
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
解法
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt();
int m = scan.nextInt();
int[] arr1 = new int[n];
int[] arr2 = new int[m];
int[][] dp = new int[n+1][m+1];
for (int i = 0; i < n; i++) {
arr1[i] = scan.nextInt();
}
for (int i = 0; i < m; i++) {
arr2[i] = scan.nextInt();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(arr1[i]==arr2[j]){
dp[i+1][j+1]=dp[i][j]+1;
}else{
dp[i+1][j+1]=Math.max(dp[i+1][j], dp[i][j+1]);
}
}
}
System.out.println(dp[n][m]);
scan.close();
}
}