题目描述
给定一个长度为 NN 数组 aa 和一个长度为 MM 的数组 bb。
请你求出它们的最长公共子序列长度为多少。
输入描述
输入第一行包含两个整数 N,MN,M,分别表示数组 aa 和 bb 的长度。
第二行包含 NN 个整数 a_1,a_2,…,a_na1,a2,…,a**n。
第三行包含 MM 个整数 b_1,b_2,…,b_nb1,b2,…,b**n。
1\leq N,M \leq 10^31≤N,M≤103,1\leq a_i,b_i \leq 10^91≤a**i,b**i≤109。
输出描述
输出一行整数表示答案。
输入输出样例
示例 1
输入
5 6
1 2 3 4 5
2 3 2 1 4 5
输出
4
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
题解
本题就是最长公共子序列模板题,套用dp直接做就可以
注意dp数组的遍历从1开始到a.length b.length结束
代码
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[] a = new int[N];
int[] b = new int[M];
for(int i = 0; i < N; i++){
a[i] = scan.nextInt();
}
for(int i = 0; i < M; i++){
b[i] = scan.nextInt();
}
System.out.println(lcs(a,b));
scan.close();
}
//求最长公共子序列
public static int lcs(int[] a, int[] b){
//dp[i][j]表示以[0,i-1] [0,j-1]两区间中的最长公共子序列
int[][] dp = new int[a.length + 1][b.length + 1];
//注意i,j从1开始 便于遍历
for(int i = 1; i <= a.length; i++){
for(int j = 1; j <= b.length; j++){
if(a[i - 1] == b[j - 1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
}
}
}
return dp[a.length][b.length];
}
}