这道题与上一道题类似,然而又有不同。采用的动态规划的方法。然而这一次不能直接通过统一初始化将第一行和第一列的值确定了,因为上一题中,没有障碍的限制,所以总会有路径到第一行和第一列的格子,而在这一题中,如果有障碍,则有可能到第一行和第一列的某个格子的路径数为0。所以分了4种情况讨论。
- 如果当前格子有障碍,则路径数为0
- 如果当前格子是初始格子,则路径数为1
- 如果是第一行和第一列的格子,那么该格子就根据到达它们的路径是否通畅来决定是1还是0。如果是第一行的格子,那么一定由左边的格子到达,所以 ,如果是第一列的格子,那么一定由上边的格子到达,所以
- 其他情况下,格子可以通过上面和左边的格子转移
需要注意的是,这几个条件是有顺序的,也就是达成了一个条件之后,就不能再跳到其他条件的程序段中,对路径数重新赋值。
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]