62.不同路径
思路
-
确定dp数组(dp table)以及下标的含义 dp[i][j]:坐标为i,j的位置有dp[i][j]种路径
-
确定递推公式
dp[i][j]=dp[i-1][j]+dp[i][j-1]
3.dp数组如何初始化
dp[0][j]=1
dp[i][0]=1
4.确定遍历顺序
5.举例推导dp数组
提交

python
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
if m==0 and n==0:
return 0
dp=[[0]*n for _ in range(m)]
for i in range(m):
dp[i][0]=1
for j in range(n):
dp[0][j]=1
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[m-1][n-1]
63. 不同路径 II
题目链接63. 不同路径 II - 力扣(LeetCode)
思路
-
只能右 / 下走 ,不能走障碍物(
grid[i][j]==1) -
dp[i][j] = 到达 (i,j) 的路径数
-
规则:
-
遇到障碍物:
dp[i][j] = 0(走不通) -
第一行 / 第一列:前面有障碍,后面都到不了
-
其他:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
-
注意点就是初始化的时候,要判断第一行第一列是否有障碍
提交

python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid) # 行数
n = len(obstacleGrid[0]) # 列数
# 起点就是障碍物,直接返回0
if obstacleGrid[0][0] == 1:
return 0
# 初始化dp数组
dp = [[0] * n for _ in range(m)]
dp[0][0] = 1 # 起点路径数=1
# 初始化第一列(只能从上边来)
for i in range(1, m):
if obstacleGrid[i][0] == 0: # 没障碍
dp[i][0] = dp[i-1][0]
# 有障碍则保持0
# 初始化第一行(只能从左边来)
for j in range(1, n):
if obstacleGrid[0][j] == 0: # 没障碍
dp[0][j] = dp[0][j-1]
# 有障碍则保持0
# 填dp表
for i in range(1, m):
for j in range(1, n):
# 当前是障碍物,路径数=0
if obstacleGrid[i][j] == 1:
dp[i][j] = 0
else:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[m-1][n-1]