# 120 Triangle
题目来源:
https://leetcode.com/problems/triangle/description/
题意分析:
给定一个三角形,找到一条使经过数值之和最小的从顶到下的路径,每次只能移动到下一层相邻的结点。题目要求只能使用O(n)的额外空间,n为三角形行数。
栗子:
题目思路:
经典的动态规划问题,先不管空间问题,创建一个类似的三角形res_triangle,每个位置都记录从顶到达该位置的最小花费。跟上一题类似,写出动态转移方程:
Res_triangle[row][col]=res_triangle[row-1][col]+triangle[row][col] if col==0
=res_triangle[row-1][col-1]+triangle[row][col] if col==row
=18.min(res_triangle[row-1][col-1]+triangle[row][col],res_triangle[row-1][col]+triangle[row][col]) if other
初始化Res_triangle[row][col]=triangle[0][0].
结果就过了。Leetcode对空间的要求没有题目要求的严格嘛。去DIscuss看到了一种自底向上的解法,空间达到了题目的要求,觉得被题目中的from top to bottom迷惑了。
代码:
1. class Solution:
2. def minimumTotal(self, triangle):
3. """
4. :type triangle: List[List[int]]
5. :rtype: int
6. """
7. res_triangle=[[]]*len(triangle)
8. for row in range(0,len(triangle)):
9. res_triangle[row]=triangle[row][:]
10.
11. for row in range(1,len(triangle)):
12. for col in range(0,row+1):
13. if col==0:
14. res_triangle[row][col]=res_triangle[row-1][col]+triangle[row][col]
15. elif col==row:
16. res_triangle[row][col]=res_triangle[row-1][col-1]+triangle[row][col]
17. else:
18. res_triangle[row][col]=min(res_triangle[row-1][col-1]+triangle[row][col],res_triangle[row-1][col]+triangle[row][col])
19.
20. return min(res_triangle[len(triangle)-1])
21.
提交细节: