数据结构与算法之 leetcode 动态规划最小路径和算法 二维 DP 数组

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


动态规划最小路径和算法:二维 DP 数组在 LeetCode 中的应用

动态规划(Dynamic Programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中广泛应用的方法。它通过将复杂问题分解为更小的子问题,并存储这些子问题的解,从而避免重复计算,提高算法效率。在 LeetCode 等编程竞赛和面试中,动态规划是解决许多算法问题的重要工具之一。

本文将围绕动态规划中的最小路径和算法,详细介绍二维 DP 数组在解决此类问题中的应用。我们将通过 LeetCode 上的经典题目来展示如何使用二维 DP 数组解决最小路径和问题。

最小路径和问题概述

最小路径和问题是指在一个二维数组中,从左上角到右下角的最短路径之和。在这个路径中,只能向下或向右移动。例如,给定一个二维数组:


[


[1, 3, 1],


[1, 5, 1],


[4, 2, 1]


]


我们需要找到从左上角 (0,0) 到右下角 (2,2) 的最小路径和。

二维 DP 数组

在解决最小路径和问题时,我们可以使用二维 DP 数组来存储到达每个位置的最小路径和。DP 数组的每个元素 `dp[i][j]` 表示到达位置 `(i, j)` 的最小路径和。

状态转移方程

为了构建 DP 数组,我们需要定义状态转移方程。对于每个位置 `(i, j)`,我们可以从左边 `(i, j-1)` 或上面 `(i-1, j)` 移动到当前位置。状态转移方程如下:


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


其中,`grid[i][j]` 是二维数组中位置 `(i, j)` 的值。

初始化

在构建 DP 数组之前,我们需要初始化 DP 数组的边界值。对于第一行和第一列,由于只能从左边或上面移动,因此:


dp[0][j] = grid[0][j] 第一行


dp[i][0] = grid[i][0] 第一列


计算过程

按照状态转移方程,我们可以从左上角开始,逐个计算 DP 数组中的值,直到到达右下角。

LeetCode 题目示例

以下是一个 LeetCode 上的最小路径和问题示例:

python

def minPathSum(grid):


if not grid or not grid[0]:


return 0

m, n = len(grid), len(grid[0])


dp = [[0] n for _ in range(m)]

初始化第一行和第一列


dp[0][0] = grid[0][0]


for i in range(1, m):


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


for j in range(1, n):


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

计算 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 数组并应用状态转移方程,我们可以高效地计算出从左上角到右下角的最小路径和。在 LeetCode 等编程竞赛和面试中,掌握动态规划方法对于解决算法问题至关重要。

扩展阅读

- [LeetCode 动态规划专题](https://leetcode-cn.com/leetbook/read/dynamic-programming/ii/)

- [Python 动态规划教程](https://www.geeksforgeeks.org/dynamic-programming-set-1/)

- [LeetCode 最小路径和问题](https://leetcode-cn.com/problems/min-path-sum/)

通过阅读以上资料,您可以进一步了解动态规划在算法问题中的应用,并提高自己的编程能力。