动态规划之不同路径解决问题

这篇具有很好参考价值的文章主要介绍了动态规划之不同路径解决问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 题目解析

题目链接选自力扣 : 不同路径
image.png
题目不难读懂, 就是遵循一个规则, 机器人从起点开始, 只允许向右或者向下行走, 不允许返回而最终到达终点时一共有多少种不同的路径. 比如在一个 2 * 3 的矩阵里, 从做烧焦起点(0,0) 到达终点右下角(1,2) 一共有多少种方法. 通过题目要求, 发现一共有三种不同路径的走法.
image.png

2. 状态表示

这和我们前面几道动态规划不一样了. 它从一个一维的线性表变成了一个二维的. 但整体的思路还是不变的. 根据我们的题目要求, 定义 dp[i][j] 表示 从起始位置( 0, 0 ) 到终点 ( i , j ) 一共有多少种不同的路径方法数.

3. 状态转移方程

虽然现在的 dp 表变成了一个二维的 dp 表, 但是还是可以采取我们的最近一步划分问题.

何为最近一步呢 ? 看了前面的几篇文章相信你也和我一样不陌生了. 那这里我就直接划分了.
image.png
当这个机器人想到达 ( i, j) 这个位置时就必须先到 ( i-1, j ) 的位置向下一步或者先到 ( i, j-1 ) 的位置后向前一步到达( i, j ) 位置. 那么此时 dp[i][j] 就分为了两种情况.

  1. 从( i-1, j ) 位置过来的.

必须经过 ( i-1, j ) 然后向下一步到达终点, 因此到达 ( i-1, j ) 有多少种方法, 那么最终经过 ( i-1, j ) 到达终点就有几种方法.

例如 : 到达 ( i-1, j ) 因为不能向上回退, 只有一条路. A-> B -> C. 最终通过 C 点到达终点, 只是在这个路径方法上多了一个点, 并非多了一条不同的路径. 即 A-> B -> C-> G. 因此最终到达 ( i-1, j ) 位置有多少种不同的路径方法到达终点就有几种.

此时正好对应我们的状态表示, 即 dp[i-1][j]

  1. 从( i, j-1 ) 位置过来的.

同样的, 必须先经过( i, j-1 ) 位置后向前一步到达终点. 因此到达 ( i, j-1 ) 这个点有多少种方法最终到达终点就有几种方法.

例如 : A-> B-> F 或者 A-> E-> F 一共条不同的路径. 最终到达终点时的路径只不过是多加了一个点并非多了一条新的路径. 最终为 A-> B-> F->G 以及 A-> E-> F-> G.

根据状态表示, 到达 ( i, j-1 ) 这个点有多少种路径则到达终点有多少种, 即 dp[i][j-1]

最终的dp[i][j] 为两种最近情况的总和. 即 dp[i][j] = dp[i][j-1] + dp[i-1][j]

4. 初始化

对于初始化, 目的就是为了防止我们填写 dp 表数据时发生越界. 比如在填写这个绿色五角星点时,. 根据我们的状态转移方程可以知道, 需要知道这个点的上一个位置和后一个位置的值. 但是很明显此时上一个位置时没有的越界了. 因此我们需要对它进行初始化防止后续填写 dp 表发生越界.
image.png
对于这个题, 我们可以采取简单除暴的直接初始化的方法. 也就是把第一行和第一列都进行初始化了. 这样在使用到的时候就不会越界了. 那么这个值该初始化为多少好呢 ?
image.png
细想这个路线. 对于第一行而言. 这上面的每一个点从起始点过来都只有一条路可以走. 即向右.

对于第一列而言. 这上面的每一个点从起始点过来也只有一条路可以走. 即向下. 因此初始化这一行和这一列时, 这上面的每一个点都应为 1.

但是这种方法还是比较麻烦的, 虽然它很直观. 为了将它放在填表的时候进行初始化, 根据上次讲解 解码方法 这个题时, 讲了一种多开一个格子的初始化方法. 这次依然用这种方法. 什么意思呢 ? 也就是让这个二维的 dp 数组多开一行多开一列.
image.png
红色的格子就是我们多开的一行和一列. 那么现在我们该如何进行初始化呢 ? 根据动态转移方程不难想. 当我们想初始化起始点的时候, 只需要知道它的上一个点和前一个点的路径数即可对吧 ?
image.png
上面说了, 原本这个矩阵的第一行和第一列上的每一个点都要为 1 才能保证我们填表的正确性. 在结合我们的动态转移方程. 也就是只需要保证起始点的前一个位置为 1 或者上一个位置为 1. 此时填表的时候就可以直接将起始点进行初始化了.

总的来说就需要保证起始点位置为 1. 通过状态方程在填表时就可以将原本矩阵的第一行和第一列进行初始化了.
image.png

5. 填表顺序

这是一个二维的 dp 表. 从状态转移方程来说, 需要知道当前位置的前一个位置和上一个位置的路径总数. 因此填表的顺序毫无疑问是 从上往下填写每一行, 而每一行又从左往右填写

6. 返回值

此时我们的 dp 表多开了一行和一列 变成了 dp[m+1][n+1], dp 表中终点的位置存放的值对应从起点到终点的不同路径数. 对应到我们的 dp 表中则为 dp[m][n]. ( 注意下标关系 )文章来源地址https://www.toymoban.com/news/detail-500606.html

7. 代码演示

class Solution {
    public int uniquePaths(int m, int n) {

        // 1. 创建 dp 表
        // 注意多开了一行一列.
        int[][] dp = new int[m + 1][n + 1];

        // 2. 初始化
        // 确保起始点为 1. 保证起始点的上一个位置或者前一个位置为 1即可正确填写后续 dp 表
        dp[0][1] = 1; // 我选择原本矩阵起始点的上一个点.
        // dp[1][0] = 1; // 也可以选择原本矩阵起点的前一个点

        // 3. 填写 dp 表
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                // 根据状态转移方程进行填表
                dp[i][j] = dp[i][j-1] + dp[i-1][j];
            }
        }

        // 4. 确认返回值
        return dp[m][n];
    }
}

到了这里,关于动态规划之不同路径解决问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我在代码随想录|写代码Day33 | 动态规划| 路径问题| 62.不同路径,63. 不同路径 II,343. 整数拆分

    🔥博客介绍`: 27dCnc 🎥系列专栏: 数据结构与算法 算法入门 C++项目 🎥 当前专栏: 算法入门 专题 : 数据结构帮助小白快速入门算法 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)o .。.:*☆ ❤️感谢大家点赞👍收藏⭐评论✍️ 今日学习打卡 代码随想录 - 动态规划

    2024年03月11日
    浏览(63)
  • 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    2:关于本题的矩阵乘法和递推方程的得出 3:实例演示 三:思路 =================================================================== 思路:这里在考虑的的时候,因为是多个矩阵相乘,求的最小乘法次数, 比如 A1_A2_A3_A4, 那么根据划分的不同,那么其乘法顺序也会不同,继而所求的乘法次数

    2024年04月09日
    浏览(76)
  • 动态规划——不同路径II

    63. 不同路径 II - 力扣(LeetCode)​编辑https://leetcode.cn/problems/unique-paths-ii/description/ https://leetcode.cn/problems/unique-paths-ii/description/ 问题描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达

    2024年01月16日
    浏览(47)
  • 【力扣】62. 不同路径 <动态规划>

    一个机器人位于一个 m m m x n n n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2: 输入:m

    2024年02月10日
    浏览(42)
  • 力扣62.不同路径(动态规划)

    2024年02月13日
    浏览(40)
  • 【学会动态规划】不同路径(5)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:62. 不同路径 - 力扣(Leetcod

    2024年02月16日
    浏览(29)
  • 动态规划 Leetcode 62 不同路径

    Leetcode 62 学习记录自代码随想录 要点:1.二维表格,想到(i,j)去代表其坐标,dp数组也因此为二维数组; 2.递推公式 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 的上一步只能是其左边或上边,所以 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] d p [ i ] [ j ] =

    2024年03月13日
    浏览(43)
  • 算法D39 | 动态规划2 | 62.不同路径 63. 不同路径 II

    今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下 62.不同路径  本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。  代码随想录 视频讲解: 动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili 这个题看

    2024年04月10日
    浏览(45)
  • 算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

    Category Difficulty Likes Dislikes ContestSlug ProblemIndex Score algorithms Medium (67.70%) 1746 0 - - 0 Tags Companies 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    2023年04月25日
    浏览(45)
  • LeetCode刷题笔记【30】:动态规划专题-2(不同路径、不同路径 II)

    参考前文 参考文章: LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯) LeetCode链接:https://leetcode.cn/problems/unique-paths/description/ 动态规划 : 创建m×n的数组, 对应这个地图, 数组 val 表示 有几种方法可以走到这一格 最开始, 第一行和第一列v

    2024年02月09日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包