
64. 最小路径和
右 → 下:1 + 2 + 4 = 7 下 → 右:1 + 3 + 4 = 8 初始化 DP 表:创建一个同样大小的 处理边界条件:初始化第一行和第一列,因为它们是计算其他单元格的基础。 填充 DP 表:使用递推公式逐个计算每个单元格的值,最终得到
发布日期:2021-05-18 05:02:43
浏览次数:21
分类:精选文章
本文共 1708 字,大约阅读时间需要 5 分钟。
动态规划求解矩阵最小路径和问题
问题描述
在一个给定的矩阵中,每一个格子都有一定的数值。我们需要找到一条路径,使得路径上所有数值的总和最小。路径定义为从左上角到右下角的连续向下或向右移动的过程。
举个例子,假设给定的矩阵如下:
nums = [ [1, 2], [3, 4]]
那么,可能的路径有两条:
所以,最小路径和为7。
动态规划优化思路
为了高效地解决这个问题,我们可以使用动态规划(Dynamic Programming,简称DP)方法。动态规划的核心思想是将大问题分解为小子问题,一次解决一个子问题,最终得到答案。
我们可以在矩阵中创建一个二维数组 dp
,其中 dp[i][j]
表示到位置(i,j)的最小路径和。
递推公式
到位置(i,j)的最小路径和 dp[i][j]
可以通过以下公式计算:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + nums[i][j]
这个公式的意思是:从上方(i-1,j)或左方(i,j-1)来到当前位置(i,j),然后加上当前位置的数值 nums[i][j]
。我们选择最小的那个路径来更新 dp[i][j]
。
初始化
由于递推公式涉及到上方和左方的值,所以我们需要对第一行和第一列进行特殊处理。
- 第一行(i=0): 从左到右依次计算路径和。
dp[0][j] = dp[0][j-1] + nums[0][j]
- 第一列(j=0): 从上到下依次计算路径和。
dp[i][0] = dp[i-1][0] + nums[i][0]
这样,递推过程就不会出现数组越界的问题。
代码实现
根据以上思路,以下是实现最小路径和的动态规划代码:
def minPathSum(grid): """ 使用动态规划求解矩阵最小路径和问题 @param grid: m x n 的矩阵 @return: 最小路径和 """ if not grid: return 0 m = len(grid) n = len(grid[0]) if m > 0 else 0 # 创建一个 m x n 大小的 DP 表 dp = [[0 for _ in range(n)] for _ in range(m)] # 初始化 dp[0][0] = grid[0][0] # 初始化第一行 for j in range(1, n): dp[0][j] = dp[0][j-1] + grid[0][j] # 初始化第一列 for i in range(1, m): dp[i][0] = dp[i-1][0] + grid[i][0] # 填充DP 表 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]
结果分析
通过上述动态规划方法,我们可以高效地计算出矩阵中的最小路径和。具体步骤分为以下几个部分:
dp
表。dp[m-1][n-1]
,即最小路径和。这种方法的时间复杂度为 O(m x n),空间复杂度为 O(m x n)(用于存储 DP 表)。非常适合处理较大的矩阵问题。
总结
动态规划是一种非常有用的算法设计方法,尤其在解决具有重叠子问题的小规模问题时特别有效。在本题中,通过动态规划,我们可以在 O(m x n) 时间复杂度内轻松找到矩阵中的最小路径和。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月06日 01时10分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
实习记-3
2019-03-16
2008年7月20日星期日
2019-03-16
c#启动本机程序
2019-03-16
用户登陆的验证码的制作
2019-03-16
判断远程文件是否存在
2019-03-16
跟小静读CLR via C#(15)--String,熟悉而又陌生
2019-03-16
升级java11后,maven命令打包报错
2019-03-16
JAVA入门[4]-IntelliJ IDEA配置Tomcat
2019-03-16
springboot redis key乱码
2019-03-16
Win10禁用自带的笔记本键盘
2019-03-16
insmod模块的几种常见错误
2019-03-16
shell及脚本4——shell script
2019-03-16
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16
数据帧CRC32校验算法实现
2019-03-16
【转载】DSP基础--定点小数运算
2019-03-16
idea thymeleaf页面变量报错解决
2019-03-16
云游戏,打响5G第一战
2019-03-16
Docker 拉取镜像速度太慢
2019-03-16
关于window匿名通道的使用以及所遇到的问题
2019-03-16