# 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.               

 

提交细节:

120 Triangle

相关文章: