题目描述
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
输入输出
思路分析
遇到统计可行路径的数量问题,或者求最小路径,一般有两种方法,搜索和动态规划。
注: 搜索一般在数据规模比较小的时候使用。复杂度比较高,在本题中: \(2^{m+n}\)。故采用动态规划
动态规划
状态定义:dp[i][j]:从左上角->(i,j)的最短路径和
状态转移方程: \(dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]\)
边界情况:左边界:i≠0,j=0, \(dp[i][j] = dp[i-1][j] + grid[i][j]\)
边界情况:上边界:i=0,j≠0, \(dp[i][j] = dp[i][j-1] + grid[i][j]\)
初始状态:dp[0][0] = grid[0][0]
代码实现:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
# if not grid or not grid[0]:
# return 0
m,n = len(grid),len(grid[0])
dp = [[0]*n for _ in range(m)]
# 起始节点
dp[0][0] = grid[0][0]
# 动态规划填表
for i in range(m):
for j in range(n):
if i==j==0:
continue
# 上边界
elif i==0:
dp[i][j] = dp[i][j-1]+grid[i][j]
# 左边界
elif j==0:
dp[i][j] = dp[i-1][j]+grid[i][j]
else:
# 状态转移方程
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
return dp[m-1][n-1]