从上往下技巧性地行走,寻觅下降路径的最小和
2023-09-19 19:12:32
导语
在信息学竞赛、企业算法面试以及人工智能领域,动态规划是一种强大的算法范式,用于解决具有重叠子问题的复杂优化问题。在这些问题中,动态规划将问题分解成更小的子问题,并通过逐步构建子问题的解决方案来解决整个问题。今天,我们将探索一个有趣的动态规划问题:LeetCode 931. 下降路径最小和。
问题背景
LeetCode 931. 下降路径最小和给定一个 n x n 的方形整数矩阵,您需要从矩阵的左上角出发,每一步只能向下或者向右移动,最终到达矩阵的右下角。您希望找到从左上角到右下角的下降路径中,所有元素的总和最小。
解决思路
解决这个问题的思路是基于动态规划的思想。我们可以构建一个备忘录表,其中包含从左上角到每个矩阵单元的最小路径总和。我们可以从左上角开始,逐渐向下和向右移动,在每次移动时,我们更新备忘录表中的值,以存储从左上角到当前单元的最小路径总和。当我们到达右下角单元时,备忘录表中存储的值就是从左上角到右下角的下降路径的最小和。
算法步骤
以下是解决 LeetCode 931. 下降路径最小和问题的详细步骤:
-
初始化备忘录表 :创建一个 n x n 的备忘录表,其中每个单元格的值都初始化为无穷大。
-
设置左上角单元 :将备忘录表中左上角单元的值设置为矩阵左上角单元的值。
-
迭代矩阵 :从左上角单元开始,依次向下和向右移动,直到到达右下角单元。
-
更新备忘录表 :在每次移动时,我们都会更新备忘录表中的值。对于每个单元格,我们计算从左上角到当前单元的最小路径总和,并将其存储在备忘录表中。
-
返回结果 :当我们到达右下角单元时,备忘录表中存储的值就是从左上角到右下角的下降路径的最小和。我们将该值作为结果返回。
代码示例
def minFallingPathSum(matrix):
n = len(matrix)
dp = [[float('inf')] * n for _ in range(n)]
dp[0][0] = matrix[0][0]
for i in range(1, n):
dp[i][0] = dp[i - 1][0] + matrix[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j - 1] + matrix[0][j]
for i in range(1, n):
for j in range(1, n):
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j]
return min(dp[-1])
结语
通过对 LeetCode 931. 下降路径最小和问题的深入解析和代码实现,我们领略了动态规划算法的魅力。这种算法能够将复杂问题分解成较小的子问题,并通过逐步构建子问题的解决方案来解决整个问题。在解决类似的优化问题时,动态规划无疑是我们的有力武器。