美文网首页
动态规划(四)

动态规划(四)

作者: 倚仗听江 | 来源:发表于2020-08-23 12:11 被阅读0次

上一篇文章写了在动态规划中,最长子序列这一类型的题目。这一次我想要来讲一讲关于杨辉三角这一类型的题目,在LeetCode上这一类型的题目有:
第119题 杨辉三角2 https://leetcode-cn.com/problems/pascals-triangle-ii/
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
输入: 3
输出: [1,3,3,1]
从示例就可以看出:第 k 行,是索引为 k 的行数,即 k+1 行。
其实这道题的状态转移方程是挺好找的,就是根据杨辉三角的特性即可得到:dp[i][j] = dp[i-1][j-1]+dp[i-1][j],然后我们还可以用滚动数组来把空间复杂度降低到O(k)。注意,要复用数组,我们就可以自然而然的想到,可以从后往前更新。因此代码如下:

public static List<Integer> getRow(int rowIndex) {
        int[] dp = new int[rowIndex + 1];
        for (int i = 0; i <= rowIndex; i++) {
            for (int j = i; j >= 0; j--) {
                dp[j] = j == 0 || j == i ? 1 : dp[j - 1] + dp[j];
            }
        }
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < dp.length; i++) {
            list.add(dp[i]);
        }
        return list;
    }

同类型的题目还有第120题 三角形最小路径和 https://leetcode-cn.com/problems/triangle/
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
这道题的关键就是要想明白,到达当前点的最小路径等于它自己加上到达上面两个点的最小距离中的较小值。但这里还要除去特殊情况,就是分别在两边的点。到达他们的最小距离就等于到达上面那个点的最小距离加上自身。ok,代码如下:

public static int minimumTotal(List<List<Integer>> triangle) {
        int n = triangle.size();
        int[][] dp = new int[n][n];
        dp[0][0] = triangle.get(0).get(0);
        for (int i = 1; i < n; i++) {
            dp[i][0] = dp[i - 1][0] + triangle.get(i).get(0);
            for (int j = 1; j < i; j++) {
                dp[i][j] = triangle.get(i).get(j) + Math.min(dp[i - 1][j - 1], dp[i - 1][j]);
            }
            dp[i][i] = dp[i - 1][i - 1] + triangle.get(i).get(i);
        }
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            ans = Math.min(ans, dp[n - 1][i]);
        }
        return ans;
    }

在此基础上,我们还可以使用滚动数组来降低空间复杂度,代码如下:

public static int minimumTotal(List<List<Integer>> triangle) {
        int n = triangle.size();
        int[] dp = new int[n + 1];
        dp[0] = triangle.get(0).get(0);
        for (int i = 1; i < n; i++) {
            //每行最后一个
            dp[i] = dp[i - 1] + triangle.get(i).get(i);
            for (int j = i - 1; j > 0; j--) {
                //从后往前
                dp[j] = Math.min(dp[j - 1], dp[j]) + triangle.get(i).get(j);
            }
            //每行第一个,给dp[0]赋值下一轮的第一个
            dp[0] += triangle.get(i).get(0);

        }
        int ans = dp[0];
        for (int i = 0; i < n; i++) {
            ans = Math.min(ans, dp[i]);
        }
        return ans;
    }

好了,以上就是我对于动态规划中杨辉三角这类题目的一些理解,本人才疏学浅,如有不对,还望批评指正。

相关文章

  • 动态规划(四)

    上一篇文章写了在动态规划中,最长子序列这一类型的题目。这一次我想要来讲一讲关于杨辉三角这一类型的题目,在LeetC...

  • 动态规划(四)

    0-1背包问题 有一个背包,他的容量为C(Capacity)。现在有n种不同的物品,编号为0...n-1,其中每一...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • 动态规划

    问题 什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算...

  • 动态规划四要素

    1.动规的状态 State —— 递归的定义 - 用 f[i] 或者 f[i][j] 代表在某些特定条件下某个规模...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 《数据结构与算法之美》27——初识动态规划

    前言 今天开始学习动态规划,一共有三节,分别是:初识动态规划、动态规划理论、动态规划实战。今天这一节就是初识动态规...

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

网友评论

      本文标题:动态规划(四)

      本文链接:https://www.haomeiwen.com/subject/kiwvjktx.html