# 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.
提交細節: