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

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 11:43
春招失败、父母离婚,好像我的人生一团糟,一年来压力大到常常崩溃。不知道能跟谁聊,朋友其实对我非常好,但是她无意中表达出来的家庭幸福都会刺痛到我……和ai聊天,我的未来在更高处,不在楼下,忍不住爆哭😭
youngfa:害,妹妹,我是一个研究生(很上进很想找到好工作的那种),但去年因为生病回家休养错过了秋招(当时对我的冲击也是非常大的),这学期返校来了也是把论文盲审交了后才开始找工作,现在也是一个offer没有,但我就没有像你一样把这个阶段性的事情绑定到人生上,人生不仅很长,也很广阔,先停下来,放松一下哦。不要被外部环境灌输的思维操控了,好好爱自己!
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务