最小路径和 动态规划

64. 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]

输出:7

解释:因为路径 1→3→1→1→1 的总和最小。

示例 2

输入:grid = [[1,2,3],[4,5,6]]

输出:12

思路:

  这题和62. 不同路径很相似,几乎可以按一模一样的代码结构做出来。但不同的是,62题求的是路径数,这一题求得是最小路径和。

  我们同样定义动态规划数组dp[][]dp[i][j]表示到达(i,j)位置的最小路径

  要注意求路径数和路径和的不同。还是先拿最上面一行的网格举例:求路径数时,整个一行都是1;而求最小路径和时,整个一行都是逐个累加的结果。对于最左边一列的情况也是类似的不同。

  对于其他网格,状态转移方程为:

  dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j]

  可以看到,因为到(i,j)位置的最小路径,要么就是从上面到来,要么就是从左面到来,我们要看看哪个更小。最终我还必须要加上它本身的值。

代码:

class Solution(object):

    def minPathSum(self, grid):

        m = len(gri1d) #得到行数和列数

        n = len(grid[0])

        dp = [[0]*n for _ in range(m)]#定义动态规划二维数组

#dp[i][j]表示到达(i,j)位置的最小路径

        dp[0][0]=grid[0][0]#左上角的值初始化为原位置值

        for i in range(1,n):#初始化最上面的网格

            dp[0][i]=dp[0][i-1]+grid[0][i]

        for i in range(1,m):#初始化最左边的网格

            dp[i][0]=dp[i-1][0]+grid[i][0]

        #开始动态规划

        for i in range(1,m):

            for j in range(1,n):#对于非最上边和非最左边的网格,使用状态转移方程

#看看左边来的路径短还是上边来的路径短

                dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j]

        return dp[m-1][n-1]

小结:

  再次强调,这道题和62. 不同路径极其相关,强烈建议对比着学习。共同掌握,在对比中你会豁然开朗~

posted @   JunanP  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示