LeetCode-Triangle

题目是给定一个三角形,求最小的路径和,每一步只能移动到它的相邻列,这条规则要看清楚,意思是第i行的第j列只能移动到第 i + 1 行的第j列或j + 1列。这题也比较简单,依然是DP的思路,保存每一行每一列的从顶端到该元素的最小和即可。

题目下面的这个提示不是很理解:

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

按照我上面的方法根本就不需要额外的空间,直接在给的三角形上从上到下逐步更新每个元素的最小和就可以了,最后的解就是最后一行的所有元素的最小值。

 1 class Solution {
 2 public:
 3     int minimumTotal(vector<vector<int> > &triangle) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         int ret = 0;
 7         int h = triangle.size();
 8         for (int i = 1; i < h; i++) {
 9             for (int j = 0; j <= i; j++) {
10                 if (j == 0) {
11                     triangle[i][j] += triangle[i - 1][j];
12                 }
13                 if (j == i) {
14                     triangle[i][j] += triangle[i - 1][j - 1];
15                 }
16                 if (j != 0 && j != i) {
17                     triangle[i][j] += std::min(triangle[i - 1][j - 1], triangle[i -1][j]);
18                 }
19             }
20         }
21         ret = triangle[h - 1][0];
22         for (int k = 1; k < h; k++) {
23             if (triangle[h - 1][k] < ret) {
24                 ret = triangle[h - 1][k];        
25             }
26         } 
27         return ret;
28     }
29 };

 

posted @ 2013-08-22 09:53  Exio  阅读(303)  评论(0编辑  收藏  举报