说下我自己理解的该题动态规划

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();
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务