给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
你在同一时间只能向下或者向右移动一步
样例
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。
样例 2:
输入: [[1,3,2]]
输出: 6
解释:
路线是: 1 -> 3 -> 2
题目要求只能往下或者向右走。
则单元格dp(i,j)题解应该是单元格dp(i-1,j)单元格dp(i,j-1)的较小值+单元格(i,j)的值。
考虑特殊情况边界问题:
(1)左边为边界,即i=0情况下,单元格dp(i,j)题解只能从上面来
解为单元格dp(i,j-1)+单元格(i,j)的值。
(2)上边为边界,即j=0情况下。解只能从左边来。解为单元格dp(i-1,j)+单元格(i,j)的值。
(3)上下都是边界,即处于起点位置,直接返回坐标(i,j)。
class Solution:
"""
@param grid: a list of lists of integers
@return: An integer, minimizes the sum of all numbers along its path
"""
def minPathSum(self, grid):
# write your code here
if (not grid):
return 0
m = len(grid)#行数
n = len(grid[0])#列数
for i in range(1, n):#左边为边界时,解只能从上班来
grid[0][i] += grid[0][i - 1]
for j in range(1, m):#上边为边界时,解只能从左边来
grid[j][0] += grid[j - 1][0]
for x in range(1, m):#无边界时
for y in range(1, n):
grid[x][y] += min(grid[x - 1][y], grid[x][y - 1])
return grid[-1][-1] #包含了左边和上都是边界的情况
c=Solution()
grid=[[1,3,1],[1,5,1],[4,2,1]]
d=c.minPathSum(grid)
print(d)