总体来讲就是两个的结合体,考虑了公共后再用b[j]考虑上升的分类
优化就是,把一重循环里的值,替换成一个变量,但是这重循环出现是有条件的,所以我们条件成立再用变量去更新
import java.util.*;
public class Main{
static int N = 3010;
static int a[] = new int[N];
static int b[] = new int[N];
static int f[][] = new int[N][N];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= n; i ++) a[i] = sc.nextInt();
for(int i = 1; i <= n; i ++) b[i] = sc.nextInt();
for(int i = 1; i <= n; i ++){
int maxv = 1;
for(int j = 1; j <= n; j ++){
f[i][j] = f[i-1][j]; // 不包含a[i]的情况
if(b[j-1] < a[i]) maxv = Math.max(maxv, f[i][j-1] + 1); // 1 ~ j-1里小于a[i]的条件下取max(f[i][j-1]+1)
if(a[i] == b[j]) f[i][j] = Math.max(f[i][j], maxv); // a[i] = b[j] 才能取maxv更新
}
}
int res = 0;
for(int i = 1; i <= n ; i ++) res = Math.max(res, f[n][i]); // a中前n个数和b中任一个数结尾的最长公共上升子序列
System.out.println(res);
}
}