leetcode最小路径和 (动态规划)python

描述

给定一个只含非负整数的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)

答案:
在这里插入图片描述
半路出家的小白,写博文不容易。如果你觉得本文对你有用,请点个赞支持下。

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/107002197