题目
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]] 输出:12
思路
我们观察棋盘,定义 dp[i][j] 为从起点走到[i][j]这个格子的最小步数。
我们发现左侧和上面的格子只有一种走法,那就是从起点出发走到这个点;我们先初始化左侧和上面的棋子的步数
for i in range(1,n):
dp[0][i] += dp[0][i-1]
for i in range(1,m):
dp[i][0] += dp[i-1][0]
然后我们思考,其他格子的到达方法,我们发现每个格子只能由它上面或者左边的格子走到,我们选取路径最短的那一条即可:
for i in range(1,m):
for j in range(1,n):
dp[i][j] += min(dp[i-1][j],dp[i][j-1])
右下角的格子对应的dp值就是我们最终答案。
代码
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
dp = grid
for i in range(1,n):
dp[0][i] += dp[0][i-1]
for i in range(1,m):
dp[i][0] += dp[i-1][0]
for i in range(1,m):
for j in range(1,n):
dp[i][j] += min(dp[i-1][j],dp[i][j-1])
return dp[m-1][n-1]