HJ103 Redraiment的走法
法一
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
int[] arr = new int[num];
for (int i = 0 ; i < num ; i++) {
arr[i] = sc.nextInt();
}
//把一前一后对比,之后新增一个储存每个位置的dp数组
int[] dp = new int[num];
int max = 0;
Arrays.fill(dp, 1);
for (int i = 1 ; i < num ; i++) {
for (int j = 0 ; j < num ; j++) {
if (arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
max = Math.max(max, dp[i]);
}
}
System.out.println(max);
}
}
}
算法实现:
改题为求:
最长升序子序列问题
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 |