动规五部曲:
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
不同路径
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0 for i in range(n)] for j in range(m)]
for i in range(0, n): # 第1行应该都只有一条路径
dp[0][i] = 1
for i in range(0, m): # 第1列应该都只有一条路径
dp[i][0] = 1
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
return dp[m - 1][n - 1]
不同路径二
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid)
n = len(obstacleGrid[0])
dp = [[0 for i in range(n)] for j in range(m)]
for i in range(0, n): # 初始化行
if obstacleGrid[0][i] == 1: # 如果遇到石头,后面的应该都不可走
dp[0][i] = 0
break
else: # 否则可走初始化为1
dp[0][i] = 1
for i in range(0, m): # 初始化列
if obstacleGrid[i][0] == 1: # 如果遇到石头,后面的应该都不可走
dp[i][0] = 0
break
else: # 否则可走初始化为1
dp[i][0] = 1
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j] == 1:
dp[i][j] = 0 # 有石头,则表示不可达
else:
dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
return dp[m - 1][n - 1]
文章讲述了使用动态规划求解两种路径问题:1)网格中找到从左上角到右下角的唯一路径数量;2)考虑障碍物的情况下,找出可到达目标的路径数量。通过对dp数组的初始化和递推公式进行设定,解决了这两类问题。
1847





