问题:
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, 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).
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.
思路: 这是一道一维的动态规划题目。将三角形看成是一颗完整的二叉树,root的最短路径 = min(left tree's shortest path , right tree's shortest path), 这具有最优子结构的性质,但是题目是一个数组,我们看出子树有重叠计算, 比如5 1 8. 采用自底向上方法求解.
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
vector<int> pathLength;
for(int i = 0; i < triangle[triangle.size() - 1].size() ; i++)
{
pathLength.push_back(triangle[triangle.size() - 1][i]);
}
for(int i = triangle.size()-2; i >=0; i--)
{
for(int j = 0; j < triangle[i].size() ;j++)
{
int min = triangle[i][j];
if(pathLength[j] < pathLength[j+1])
min += pathLength[j];
else
min += pathLength[j+1];
pathLength[j] = min;
}
}
return pathLength[0];
}
};
代码写的不够简洁,可以把第一个for 放入第二个for中。min可以调用std::min