给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
自顶向下的最小路径和为 11
(即,2 + 3 + 5 + 1 = 11)。
这道题的第一个难点就出现在题目中给出的三角形。其实那就是一个普通的二维数组,为了表现成三角形所以加了缩进。
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
其实题目中给出的数组就是上面的这个样子。由于每次只能向相邻的两个结点走,因此就是说上层的点对应的最小值点是由下面的结点和右下的结点
两结点的最小值再加上当前自己的值得来的,这也就是递推公式了。
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
self.dp = {}
self.nums = len(triangle)
self.length = len(triangle[self.nums - 1])
for i in range(self.length):
self.dp[(self.nums - 1,i)] = triangle[self.nums - 1][i]
for y in reversed(range(self.nums-1)):
for x in range(len(triangle[y])):
self.dp[(y,x)] = triangle[y][x] + min(self.dp[(y+1,x)],self.dp[(y+1,x+1)])
return self.dp[(0,0)]