📅  最后修改于: 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)。