最小路径和 动态规划
给定一个包含非负整数的 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. 不同路径极其相关,强烈建议对比着学习。共同掌握,在对比中你会豁然开朗~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了