Leetcode - 64. 最小路径和
给定一个包含非负整数的
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
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 200
- 0 <= grid[i][j] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解1 2021/9/9 O(mxn)
def udpate_shang_zuo(dp:list, x:int, y:int, m:int, n:int, grid:list) -> None:
# 更新上格
### 错误 - 1
#if x>0 and dp[x-1][y]==0:
if x>0 and dp[x-1][y]==-1:
## =0的就别处理了,说明还没准备好
#if dp[x][y]==0 or (y<n-1 and dp[x-1][y+1]==0): return
if dp[x][y]==-1 or (y<n-1 and dp[x-1][y+1]==-1): return
### 错误 - 1
if y<n-1:
dp[x-1][y]=grid[x-1][y]+min(dp[x-1][y+1],dp[x][y])
else:
dp[x-1][y]=grid[x-1][y]+dp[x][y]
udpate_shang_zuo(dp, x - 1, y, m, n, grid)
# 更新左格
### 错误 - 1
#if y>0 and dp[x][y-1]==0:
if y>0 and dp[x][y-1]==-1:
## =0的就别处理了,说明还没准备好
#if dp[x][y]==0 or (x<m-1 and dp[x+1][y-1]==0): return
if dp[x][y]==-1 or (x<m-1 and dp[x+1][y-1]==-1): return
### 错误 - 1
if x<m-1:
dp[x][y-1]=grid[x][y-1]+min(dp[x+1][y-1],dp[x][y])
else:
dp[x][y-1]=grid[x][y-1]+dp[x][y]
udpate_shang_zuo(dp, x, y - 1, m, n, grid)
# 从调试看,=0不处理,最终结果是对的,不会中途停掉,不会漏,暂时没有理解
def minPathSum(grid: list) -> int:
# 和62题一样,直接拿过来改吧改吧
# f(x,y)=grid[x][y] + min(f(x,y+1),f(x+1,y))
# m,n∈[1,200]
m=grid.__len__()
n=grid[0].__len__()
if m==1:
return sum(grid[0])
if n==1:
res=0
for x in grid:
res+=x[0]
return res
### 错误 - 1
#dp=[[0 for x in range(0,n)] for y in range(0,m)]
dp=[[-1 for x in range(0,n)] for y in range(0,m)]
### 错误 - 1
x=m-1;y=n-1
dp[x][y]=grid[x][y]
# 从某个位置,可以推出上面和左边,得递归了,推到全是墙为止
udpate_shang_zuo(dp,x,y,m,n,grid)
return dp[0][0]
if __name__ == '__main__':
# 7
grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
print(minPathSum(grid))
# 12
grid = [[1, 2, 3], [4, 5, 6]]
print(minPathSum(grid))
grid = [[1, 2, 3]]
print(minPathSum(grid))
grid = [[1],[2]]
print(minPathSum(grid))
grid = [[2]]
print(minPathSum(grid))
### 错误
# 1 改吧改吧还是会出问题的,这里是计算路径,本身grid就是有0的情况,这样dp需要初始化为-1
grid=[[0, 1], [1, 0]]
print(minPathSum(grid))


浙公网安备 33010602011771号