题解
改题为求 最长升序子序列问题
1.定义一个数组dp用于存储每个数最长子序列的数值,默认为1(因为一个数的时候他的最长序列为1)。
2.使用两个下标i,j(j<i)计算数组arr 与 对应dp的值;如果arr[i] > arr[j] 的时候;计算dp[i] 此时 dp[i] = Math.max(dp[i], dp[j]+1);如下表为输入的arr与计算的dp关系。
arr | 2 | 5 | 1 | 5 | 4 | 5 |
---|---|---|---|---|---|---|
dp | 1 | 2 | 1 | 2 | 2 | 3 |
arr | 1 | 4 | 2 | 6 | 0 | 6 | 1 | 9 |
---|---|---|---|---|---|---|---|---|
dp | 1 | 2 | 2 | 3 | 1 | 3 | 2 | 4 |
3.定义一个max,用于存储最长的子序列值。
代码
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int[] dp = new int[n];
Arrays.fill(dp, 1); // 初始化为1
int max = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
// 当前的值比前面的值大的时候需要计算。
if (arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
max = Math.max(dp[i], max);
}
}
}
System.out.println(max);
}
}