【题目】
Given a m x n grid filled with non-negativenumbers, find a path from top left to bottom right which minimizes the sum ofall numbers along its path.
Note: You can only move either down orright at any point in time.
给定一个m×n的非负矩阵,每个位置(i,j)只能向下和向右),然后找到一条路使得从(0,0)到(m - 1,n - 1)经过的所有数字的和最小。
【思路】
该题与62 UniquePath很相似,均利用了(动态规划DP)思想。
在第零行,从[0][0]至该行尾,只有一条路径,所以该行元素每个位置每个位置最小和均是左边数字与其本身之和;
在第零列,从[0][0]至该列尾,只有一条路径,所以该列元素每个位置每个位置最小和均是上边数字与其本身之和;
对于非零行,非零列,[i][i]元素的最小值是左侧和上方二者中的最小值与其本身之和,这样一直迭代下去,最终右下角的数字即为所求
【Python实现】
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m = len(grid)
n = len(grid[0])
for i in range(m):
for j in range(n):
if i == 0 and j != 0:#在第0行
grid[i][j] = grid[i][j-1] +grid[i][j]
elif i != 0 and j == 0:#在第0列
grid[i][j] = grid[i-1][j]+ grid[i][j]
elif i != 0 and j != 0:#0行0列除外,寻找左侧和上方最小值
grid[i][j] =min(grid[i][j-1],grid[i-1][j]) + grid[i][j]
print(grid[m-1][n-1])
return grid[m-1][n-1]
if __name__ == '__main__':
S= Solution()
grid = [[3,1,2],[3,4,1],[1,6,2],[7,6,5]]
S.minPathSum(grid)