leetcode专题训练 63. Unique Paths II

这道题与上一道题类似,然而又有不同。采用的动态规划的方法。然而这一次不能直接通过统一初始化将第一行和第一列的值确定了,因为上一题中,没有障碍的限制,所以总会有路径到第一行和第一列的格子,而在这一题中,如果有障碍,则有可能到第一行和第一列的某个格子的路径数为0。所以分了4种情况讨论。

  • 如果当前格子有障碍,则路径数为0
  • 如果当前格子是初始格子,则路径数为1
  • 如果是第一行和第一列的格子,那么该格子就根据到达它们的路径是否通畅来决定是1还是0。如果是第一行的格子,那么一定由左边的格子到达,所以 d p [ i ] [ j ] = d p [ i ] [ j 1 ] dp[i][j] = dp[i][j-1] ,如果是第一列的格子,那么一定由上边的格子到达,所以 d p [ i ] [ j ] = d p [ i 1 ] [ j ] dp[i][j] = dp[i-1][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]

需要注意的是,这几个条件是有顺序的,也就是达成了一个条件之后,就不能再跳到其他条件的程序段中,对路径数重新赋值。

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        if not obstacleGrid:
            return 0
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0 for i in range(n)] for j in range(m)]
        for i in range(m):
            for j in range(n):
                if obstacleGrid[i][j] == 1:
                    dp[i][j] = 0
                    continue
                if i == 0 and j == 0:
                    dp[i][j] = 1
                    continue
                if i == 0:
                    dp[i][j] = dp[i][j-1]
                    continue
                if j == 0:
                    dp[i][j] = dp[i-1][j]
                    continue
                dp[i][j] = dp[i-1][j]+dp[i][j-1]
        return dp[-1][-1]
                
发布了203 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Ema1997/article/details/104081187