Day 39 | 动态规划 02

75 阅读1分钟

62. 不同路径

dp重要的是找到和前一状态之间的关系

对于本题的路径,只能往右或者往下,那么对当前位置,可以由

  • 上方的位置往下 或
  • 左侧的位置往右

得到。

def uniquePaths(self, m: int, n: int) -> int:
    # 生成mndp数组
    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[-1][-1]

63. 不同路径 II

增加了障碍物的设置

初始化dp为1,对于障碍物及只能经障碍物到达的边界,赋值为1

dp状态的更新和原题类似

def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
    m = len(obstacleGrid)
    n = len(obstacleGrid[0])
    # 注意初始化
    dp = [[1] * n for _ in range(m)]
    for i in range(m):
        for j in range(n):
            # obstacle, that is, no path
            if obstacleGrid[i][j] == 1:
                dp[i][j] = 0
            else:
                if i >= 1 and j >= 1:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
                else:
                    # 配合初始化
                    if i >= 1 and dp[i-1][j] == 0:
                        dp[i][j] = 0
                    if j >= 1 and dp[i][j-1] == 0:
                        dp[i][j] = 0
    return dp[-1][-1]

参考随想录给出的更清晰的赋值方式

dp = [[0 for _ in range(col)] for _ in range(row)]
        dp[0][0] = 0 if obstacleGrid[0][0] == 1 else 1
        if dp[0][0] == 0:
            return 0  # 如果第一个格子就是障碍,return 0
        # 第一行
        for i in range(1, col):
            if obstacleGrid[0][i] == 1:
                # 遇到障碍物时,直接退出循环,后面默认都是0
                break
            dp[0][i] = 1

        # 第一列
        for i in range(1, row):
            if obstacleGrid[i][0] == 1:
                # 遇到障碍物时,直接退出循环,后面默认都是0
                break
            dp[i][0] = 1