说下我自己理解的该题动态规划
Redraiment的走法
https://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa
以 2 5 1 5 4 5 为例,每个数据对应的
索引下标: 0, 1, 2, 3 ,4, 5。
1.不从其他位置跳到某个索引对应的高度,直接跳到该索引对应的高度,算一步。所以索引0,1,2,3,4,5对应的步数都是1.
2.因为索引0是起点,没有其他索引可以跳到索引0,所以索引0的步数还是为1。
3.因此从索引1开始,遍历从索引0到索引1,因为索引0对应的2可以跳到索引1对应的5,所以将索引0的步数1再加上1与原来索引1的步数比较,如果大于就赋值 ==>索引1的步数 = 索引0的步数 + 1此时索引1的步数为2,也就是说,从索引0到索引1,跳的步数为2.
4.同理,逐渐遍历接下来的每个高度。当我们遍历到某个索引 i 时,其实前面的每个索引的步数已经确定(通过步骤3比较并赋值)。也就是说,前面的每个索引的步数,从其他索引跳到它的最大步数已经确定。
5.由于对每个索引对应的步数已经确定,所以找出最大的步数输出即可。
核心思想:每遍历一个索引 i ,就把前面能跳到它这个索引位置的每个索引,其步数加1,看谁跳到当前索引位置的步数多
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] ints = new int[n]; for (int i = 0; i < n; i++) { ints[i] = scanner.nextInt(); } System.out.println(maxAscendingSteps(ints)); } public static int maxAscendingSteps(int[] heights) { int n = heights.length; // 初始化dp数组,dp[i]表示以i位置为结尾的最长上升子序列长度,默认至少为1(自己本身) int[] dp = new int[n]; Arrays.fill(dp, 1); // 动态规划核心部分,从第二个元素开始遍历,比较并更新dp值 for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { // 如果当前元素大于前一个元素且 dp[j]+1 > dp[i],则更新dp[i] if (heights[i] > heights[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } } } // 返回dp数组中的最大值,即为最长上升子序列的长度 return Arrays.stream(dp).max().getAsInt(); } }