64. 最小路径和(Medium)
题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
一句话思路:
问题可以看成是求全局最优解,即从左上角出发到右下角经过的最小路径和。
转换成局部最优解即为从左上角到当前位置的最小路径和。
代码:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
dp = [[0] * n for _ in range(m)]
#dp= [0] * (m*n)
for i in range(m):
for j in range(n):
'''上下都是边界'''
if i == 0 and j == 0:dp[i][j] = grid[i][j]
#'''上是边界,第一行,只能从左边到达'''
elif i == 0 and j != 0:dp[i][j] = dp[i][j-1] + grid[i][j]
#'''左是边界,第一列,只能从上面到达'''
elif j == 0 and i != 0:dp[i][j] = dp[i-1][j] + grid[i][j]
#'''都不是边界'''
else:dp[i][j] = min(dp[i][j-1],dp[i-1][j])+ grid[i][j]
return dp[m-1][n-1]