给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。
每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。
数据范围:三角形数组行数满足 ,数组中的值都满足
例如当输入[[2],[3,4],[6,5,7],[4,1,8,3]]时,对应的输出为11,
所选的路径如下图所示:
[[10]]
10
[[2],[3,4],[6,5,7],[4,1,8,3]]
11
最小路径是 2 , 3 ,5 , 1
[[1],[-1000,0]]
-999
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param triangle int整型二维数组 # @return int整型 # class Solution: def minTrace(self , triangle: List[List[int]]) -> int: # write code here dp = triangle.copy() for i in range(1, len(triangle)): for j in range(len(triangle[i])): if j == len(triangle[i]) - 1: dp[i][j] = dp[i-1][j-1] + triangle[i][j] elif j == 0: dp[i][j] = dp[i-1][j] + triangle[i][j] else: dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] return min(dp[-1])
class Solution: def minTrace(self , triangle: List[List[int]]) -> int: # 定义dp[i][j]为从下往上到第[i,j]个元素时的最小路径和 # 最后结果为dp[0][0] # dp转移方程为: dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j] # 初始状态: dp[m-1][j] = triangle[m-1][j] m, n = len(triangle), len(triangle[-1]) dp = [[0 for _ in range(n)] for _ in range(m)] for j in range(n): dp[m-1][j] = triangle[m-1][j] for i in range(m-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]