📜  NxN 网格中的最小总和下降路径(1)

📅  最后修改于: 2023-12-03 14:44:50.487000             🧑  作者: Mango

NxN 网格中的最小总和下降路径

问题描述

给定一个 N x N 的网格,每个格子中有一个正整数。从网格的最上方开始,每次我们可以向下移动到相邻的格子中。移动到下一个格子时,下降路径上的数字总和增加。在任何时刻,如果我们到达了网格的底部,我们就停止移动。找出从网格的最上方到底部的所有路径中,数字总和最小的路径。每个路径只能移动到相邻的格子中。

例如,在下面的3 x 3的网格中,最小的下降路径是 [1,2,1],最小总和为 4。

  [
    [1,2,3],
    [4,5,6],
    [7,8,9]
  ]
解题思路

该问题可以通过动态规划来解决。我们可以从最底部开始向上迭代,并将每个位置的网格点更新为到达该位置的最小总和。具体做法如下:

  1. 我们从最底部的行开始,将每个点网格点更新为它自身。

  2. 然后,我们从倒数第二行开始向上迭代。对于每个位置 (i, j),我们计算以下两个值:网格点本身的值和下面一行所有相邻点中到达该点的最小总和。

  3. 然后,我们将该位置的网格点更新为这两个值中的较小值。

  4. 经过上述计算后,我们最终在 (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$ 为网格的边长。