【问题描述】
Given atriangle, find the minimum path sum from top to bottom. Each step you may moveto adjacent numbers on the row below.
Forexample, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
Note: Bonus point if youare able to do this using only O(n) extra space, where n is the total number ofrows in the triangle.
【解决思路】
采用自下而上的规划思路:
用一个同等大小的二位数组roads(不建议对直接修改原数组)记录到达每个节点的最短路径。
从倒数第二行遍历至第一行(下标为 0,0),最后一行的初始值等于原数组最后一行的值。
每次遍历中,roads[i][j] = min(roads[i+1][j], roads[i+1][j+1]。
【代码实现】
class Solution:
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
roads = [[triangle[i][j] for j in range(0, i+1)] for i in range(0, len(triangle))]
# down-top approach
for i in range(len(roads)-2, -1, -1):
for j in range(0, i+1):
roads[i][j] += min(roads[i+1][j], roads[i+1][j+1])
return roads[0][0]
'''
sol = Solution()
tri = [[2], [3,4], [6,5,1], [4,1,8,1]]
print(sol.minimumTotal(tri))
'''