代码随想录|Day33|动态规划02|62.不同路径、63.不同路径II

本文介绍了两种情况下的不同路径问题:机器人在网格中从起点移动到终点,一种是没有障碍物,另一种是有障碍物。通过动态规划方法,计算到达目标位置的唯一路径数量,特别考虑了障碍对递推公式和初始化的影响。
摘要由CSDN通过智能技术生成

62.不同路径

机器人从 (0, 0) 位置出发,到 (m - 1, n - 1) 终点。

动规五步曲:

  1. 确定 dp[i][j] 含义:表示从(0, 0)出发,到 (i, j) dp[i][j] 条不同的路径
  2. 递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],机器人只能向下或者向右移动,因此当前位置的路径为从左边(dp[i][j - 1]),或从上边(dp[i - 1][j])过来。
  3. dp数组初始化:dp[0][j] = dp[i][0] = 1有递推公式可得,需要初始化第一行和第一列,由于机器人只能向右或向下,到达第一行或者第一列的位置均只有一种走法。
  4. 遍历顺序:从前向后,从上到下
  5. 打印dp数组
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        # 全部初始化为1,这样便不需要单独给第一列和第一行初始化
        dp = [[1] * n for _ 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]
        # 到达最右下角的不同路径数量
        return dp[m-1][n-1]

63.不同路径II

本题与 62.不同路径 区别是加入了障碍,这会影响递推公式和初始化两个部分:

  • 递推公式:if obstacleGrid[i][j] == 1: dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。只有当前位置不是障碍,我们才需要递推当前dp值,如果当前位置为障碍,则说明无法到达此位置,dp值默认为初始化的0。
  • 初始化:如果第一行中出现了一个障碍,从此障碍到第一行结束的位置都无法到达(机器人只能向右或向下),因此这部分需要初始化为。
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        # 这里的策略是先将dp初始化为0
        # 遇到障碍物之前初始化为1
        dp = [[0] * n for _ in range(m)]
        # 第一行的初始化
        for i in range(n):
            if obstacleGrid[0][i] == 0:
                dp[0][i] = 1
            else: break
        # 第一列的初始化
        for i in range(m):
            if obstacleGrid[i][0] == 0:
                dp[i][0] = 1
            else: break
        # 计算dp数组
        for i in range(1, m):
            for j in range(1, n):
                # 当前位置没有障碍的时候才计算dp值
                # 有障碍的时候说明无法到达此位置,dp值默认为初始化的0
                if obstacleGrid[i][j] == 0:
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

        return dp[m-1][n-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值