算法D39 | 动态规划2 | 62.不同路径 63. 不同路径 II

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

今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下

62.不同路径 

本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 

代码随想录

视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

这个题看到路径的表示,第一直觉就是一个组合数的问题,学了一下C++计算组合数防止溢出的小技巧。第二个方法再动态规划完成, 重点是把二维的动态规划dp[i][j]表示清楚,从左右到从上到下的顺序遍历就行。

Python数论:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        if m==1 or n==1: return 1
        total = m + n -2
        if m>n: m, n = n, m
        nom = denom = 1
        for i in range(m-1):
            nom *= (total-i)
            denom *= (i+1)
        result = int(nom/denom)
        return result

C++数论:

C++计算组合数需要考虑溢出的问题,long long int并不能通过所有的case,那么修改数据容量就不是个完备的解决方案了。优化的基本思路是连续m个整数相乘,一定能将m整除。

为了防止溢出,从小到大考虑,而不是从大到小(n到n-m+1, m到1)。

另外,确保m<=n的操作下,确保了m!比 n!/(n-m)!小。

主要参考组合数的计算(对溢出处理)_long long int 放不下-CSDN博客

class Solution {
public:
    int uniquePaths(int m, int n) {
        if (m==1 || n==1) return 1;
        if (m>n) {
            int tmp = n;
            n = m;
            m = tmp;
        }
        long long sum = 1;
        for (int i=1; i<m; i++) {
            sum *= m+n-1-i;
            sum /= i;
        }
        return sum;
    }
};

Python动态规划:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        if m==1 or n==1: return 1
        dp = [[0]*n for _ in range(m)]
        for i in range(1, m):
            for j in range(1, n):
                if i==1:
                    dp[i-1][j] = 1
                if j==1:
                    dp[i][j-1] = 1
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[m-1][n-1]
        

C++动态规划:

class Solution {
public:
    int uniquePaths(int m, int n) {
        if (m==1 || n==1) return 1;
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i=1; i<m; i++) {
            for (int j=1; j<n; j++) {
                if (i==1) dp[i-1][j] = 1;
                if (j==1) dp[i][j-1] = 1;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};

63. 不同路径 II 

https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html

视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

有障碍的这个变形数论就没那么适合了,动态规划遍历更合适一些。

Python:

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0]*n for _ in range(m)]
        i = j = 0
        while i<m and obstacleGrid[i][0]==0:
            dp[i][0] = 1
            i+=1
        while j<n and obstacleGrid[0][j]==0:
            dp[0][j] = 1     
            j+=1
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 0:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[m-1][n-1]
        

C++:

C++版本初始化dp表格时,不能用while实现,用forloop也可以提前终止,代码更简洁一些。文章来源地址https://www.toymoban.com/news/detail-847005.html

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        if (obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1) return 0;
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
        for (int i=1; i<m; i++) {
            for (int j=1; j<n; j++) {
                if (obstacleGrid[i][j]==0) dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};

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

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

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

相关文章

  • DAY39 62.不同路径 + 63. 不同路径 II

    题目要求:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 根据“机器人每次只能向下或者向右移动一步”

    2024年02月07日
    浏览(42)
  • 代码随想录第39天 | 62.不同路径 、 63. 不同路径 II

    一、前言 参考文献:代码随想录 今天主要的题目是动态规划的路径问题,动态规划五要点; 1、确定dp数组,dp[i]代表什么i代表什么; 2、递推公式; 3、初始化dp数组; 4、遍历顺序; 5、打印dp数组; 二、不同路径 1、思路: 我感觉动态规划,我听的很认真,然后这个题目,

    2024年04月13日
    浏览(43)
  • 我在代码随想录|写代码Day33 | 动态规划| 路径问题| 62.不同路径,63. 不同路径 II,343. 整数拆分

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

    2024年03月11日
    浏览(63)
  • 算法随想录第三十九天打卡|62.不同路径 , 63. 不同路径 II

    本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。  代码随想录 视频讲解: 动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili 总结 把m和n弄反了。 https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://programmercarl.com/00

    2024年01月20日
    浏览(50)
  • 力扣算法刷题Day39|动态规划:不同路径 I&II

    力扣题目:#62.不同路径 刷题时长:参考题解后10min 解题方法:动规 复杂度分析 时间O(m*n) 空间O(m*n) 问题总结 初始化二维数组的python语法:i 对应 m,j 对应n 二维遍历顺序,从上到下从左到右通过两层for循环实现,其中startindex应为1 本题收获 动规思路 确定dp数组及下标的含义

    2024年02月12日
    浏览(52)
  • 算法刷刷刷|动态规划篇|509.斐波那契数| 70.爬楼梯| 746.使用最小花费爬楼梯| 62.不同路径| 63不同路径2| 343.正数拆分 | 96.不同的二叉搜索树

    509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 给定 n ,请计算 F(n) 。 70.爬楼梯 746.使用最小花费爬楼梯 给你一个整数

    2023年04月23日
    浏览(56)
  • 力扣:63. 不同路径 II(动态规划)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍

    2024年01月18日
    浏览(52)
  • leetcode63. 不同路径 II(动态规划-java)

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/unique-paths-ii 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。

    2024年02月11日
    浏览(50)
  • 代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II

    动规五部曲 1.确定dp数组含义 2.确定递推公式 3.初始化数组 4.确定遍历方式 5.打印dp数组查看分析问题 题目链接:62. 不同路径 - 力扣(LeetCode) 注:n行m列而不是m行n列 1.确定dp数组含义 代表到达此下标有多少条路径 2.确定递推公式 因为只能向右或者向下走,所以到达i,j这个点的

    2024年02月06日
    浏览(50)
  • 【算法|动态规划No.6】leetcode63. 不同路径Ⅱ

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月16日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包