📜  三角形最短路径的最小长度(1)

📅  最后修改于: 2023-12-03 15:06:10.900000             🧑  作者: Mango

三角形最短路径的最小长度

什么是三角形最短路径问题?

三角形最短路径问题是指从三角形的顶点开始,沿着要求的路径(可以向左下或右下)到达最后一行的点,使得经过的路径上的数字和最小。例如,对于以下数值三角形:

   2
  3 4
 6 5 7
4 1 8 3

从顶点2出发,可以选择3或4作为下一层的走向。若选择3,则下一步可以选择6或5; 若选择4,则下一步可以选择5或7。选择6或5的最短路径都会到达最底层,而选择5是最短路径。因此,该路径的最小长度为2 + 3 + 5 + 1 = 11。

如何解决三角形最短路径问题?

三角形最短路径问题可以通过动态规划的方法来解决。假设原始的数值三角形为triangle,该三角形共有n行。定义状态dp[i][j]表示从第i行第j列节点出发,到达第n行的最小路径和。那么可以得到动态规划的式子:

$$ dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j] $$

其中triangle[i][j]表示第i行第j列节点的值。状态dp[0][0]即为题目所求的最小路径和。求解dp的过程可以通过从下向上逐层递推得到。具体来说,从第n-1行开始,对于每一层,从左到右地计算dp[i][j]的值。最后,dp[0][0]的值即为所求。

下面是Python代码实现该算法:

def minimumTotal(triangle):
    """
    :type triangle: List[List[int]]
    :rtype: int
    """
    n = len(triangle)
    dp = [[0] * n for _ in range(n)]
    for i in range(n):
        dp[n-1][i] = triangle[n-1][i]
    for i in range(n-2, -1, -1):
        for j in range(i+1):
            dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]
    return dp[0][0]

该算法的时间复杂度为O(n^2),其中n为数值三角形的行数。可以通过空间优化将空间复杂度降至O(n)。