leetcode(力扣) 62. 不同路径 & 63. 不同路径 II (动态规划)

62.不同路径:

题目描述

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

示例 1:
输入:m = 3, n = 7
输出:28

示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

示例 3:
输入:m = 7, n = 3
输出:28

示例 4:
输入:m = 3, n = 3
输出:6

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

简化题目

每次可以往右或者往下走一格,从左上走到右下一共有多少种路径。
在这里插入图片描述

思路分析

动规五步走:

1.确定dp数组含义:

dp[i][j] 表示 从左上角出发点到[i][j]格有多少种路径。

2.确定递推公式:

动态规划问题都有一种局部操作的思想,这道题就是看到[i][j]有几种路径由谁决定,由于题目已经说了,只能由往右边或者下边走,所以到[i][j] 的不同路径数,由dp[i-1][j]和dp[i][j-1]相加决定。

所以有递推公式:dp[i][j] = dp[i-1][j]+dp[i][j-1]
3.初始化dp数组:

由于只能往右或者往下走,所以他们的值都是1,也就是只有一种路径方法。

dp[0][i] 和dp[j][0]都是1.

4.确定遍历顺序:

从左到右一层一层遍历就行了。
5.模拟dp结果:

直接偷一张图。最终结果显然是dp[-1][-1]。

完整代码

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

63.不同路径 II

这道题根据上一道题改了一下,他在棋盘上加了障碍物。
还是从左上角到右下角,问你有几种路径方法,中间加了一块红色的障碍物。
在这里插入图片描述

与上一题不同的地方就是初始化有较大不同,其他位置基本没变。

可以想象一种情况,就是这个障碍物在最左边或者在最上边的情况。

比如 在这里插入图片描述
那么在dp数组里就是 1,1,1,1,0,0,0。
在上一题已经说过了,最左边和最上边所有的点都是只有一种走法,因为只能走右边或者下边。所以如果障碍物在最左边或者最上边的话,那么最左一条边或最上一条边的障碍物后面就都是0了,因为唯一的路径被切断了,没办法到达了。

一开始dp数组全部为0,只要障碍物不在起点,则就让dp[0][0] =1 依此来初始化dp[i][0]和dp[0][j]的值

这是和上一题初始化dp数组部分不太一样的地方。

另一个不一样的点就是在递推公式哪里,如果碰到障碍物,则不更新dp里的值,让dp数组对应障碍物的位置始终保持0,这样障碍物哪里的路径就一直是0了。

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        col  = len(obstacleGrid[0])
        row = len(obstacleGrid)

        dp = [[0 for i in range(col)] for j in range(row)]
        if obstacleGrid[0][0] == 1:
            return 0
        else:
            dp[0][0] =1  
        for j in range(1,col):
            if obstacleGrid[0][j]!=1:
                dp[0][j] = dp[0][j-1]
        for i in range(1,row):
            if obstacleGrid[i][0]!=1:
                dp[i][0] = dp[i-1][0]
        for i in range(1,row):
            for j in range(1,col):
                if obstacleGrid[i][j] !=1:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[-1][-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值