当前位置:   article > 正文

leetcode最小路径和 (动态规划)python_一个m * n棋盘,只能往右或者往下走,问从左上到右下路径和的最小值

一个m * n棋盘,只能往右或者往下走,问从左上到右下路径和的最小值

描述

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
你在同一时间只能向下或者向右移动一步

样例
样例 1:
输入: [[1,3,1],[1,5,1],[4,2,1]]
输出: 7

样例解释:
路线为: 1 -> 3 -> 1 -> 1 -> 1。
  • 1
  • 2

样例 2:
输入: [[1,3,2]]
输出: 6

解释:  
路线是: 1 -> 3 -> 2
  • 1
  • 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/970020
推荐阅读
相关标签
  

闽ICP备14008679号