来源:https://leetcode-cn.com/problems/minimum-path-sum/
题目描述
Given a m × n m \times n m×n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
给定一个包含非负整数的 m × n m \times n m×n网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
Example:
示例:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output:
7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
思路解析
这是一个动态规划问题。
一种直观的贪心算法是,从左上角开始,依次寻找权值最小的左跳或下跳,直到到达右下角。

但这种路径并不一定是最优的,因为局部最优并不保证整体最优。为了避免这种情况,我们可以按照移动规则(向左或向下)计算每个点到下一跳的最近距离,然后更新每个节点。




算法实现
Python3
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
np.array(grid)
m = len(grid) # 返回行数
n = len(grid[0]) # 返回列数
for i in range(m):
for j in range(n):
if i==j==0:
continue
elif i>0 and j>0:
grid[i][j]+=min(grid[i-1][j],grid[i][j-1])
elif i>0:
grid[i][j] += grid[i-1][j]
elif j>0:
grid[i][j] += grid[i][j-1]
return grid[-1][-1]