📅  最后修改于: 2023-12-03 14:44:50.487000             🧑  作者: Mango
给定一个 N x N 的网格,每个格子中有一个正整数。从网格的最上方开始,每次我们可以向下移动到相邻的格子中。移动到下一个格子时,下降路径上的数字总和增加。在任何时刻,如果我们到达了网格的底部,我们就停止移动。找出从网格的最上方到底部的所有路径中,数字总和最小的路径。每个路径只能移动到相邻的格子中。
例如,在下面的3 x 3的网格中,最小的下降路径是 [1,2,1]
,最小总和为 4。
[
[1,2,3],
[4,5,6],
[7,8,9]
]
该问题可以通过动态规划来解决。我们可以从最底部开始向上迭代,并将每个位置的网格点更新为到达该位置的最小总和。具体做法如下:
我们从最底部的行开始,将每个点网格点更新为它自身。
然后,我们从倒数第二行开始向上迭代。对于每个位置 (i, j)
,我们计算以下两个值:网格点本身的值和下面一行所有相邻点中到达该点的最小总和。
然后,我们将该位置的网格点更新为这两个值中的较小值。
经过上述计算后,我们最终在 (0, 0)
的位置处获得了所需的答案,即从最上方到底部的最小总和下降路径。
下面是使用 Python 语言实现上述思路的示例代码:
def minimumTotal(triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
# 判断输入是否为空
if not triangle:
return 0
n = len(triangle)
# 首先将最底部的点赋值为它自身
dp = triangle[-1]
# 从倒数第二行开始向上迭代
for i in range(n - 2, -1, -1):
for j in range(i + 1):
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])
# 返回最小总和
return dp[0]
该代码使用从底部开始的动态规划算法,首先将所有网格点设置为它们自身的值,然后计算到达每个位置的最小总和,最终返回 (0, 0)
位置的值。该算法的时间复杂度为 $O(n^2)$,其中 $n$ 为网格的边长。