[Problem]
[Analysis]
使用O(n)的空间存储dp
[Solution]
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).
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.
[Analysis]
使用O(n)的空间存储dp
[Solution]
class Solution {说明:版权所有,转载请注明出处。 Coder007的博客
public:
int minimumTotal(vector<vector<int> > &triangle) {
// Note: The Solution object is instantiated only once and is reused by each test case.
// empty triangle
if(triangle.size() == 0)return 0;
// only one row
if(triangle.size() == 1)return triangle[0][0];
// initial
int dp[triangle.size()];
int first = 0, second = 0, tmp = 0;
// dp
dp[0] = triangle[0][0];
for(int i = 1; i < triangle.size(); ++i){
for(int j = 0; j < i; ++j){
first = dp[j] + triangle[i][j];
second = dp[j] + triangle[i][j+1];
// set dp[j]
if(j == 0){
dp[j] = first;
}
else{
dp[j] = min(tmp, first);
}
// set dp[j+1]
if(j == i-1){
dp[j+1] = second;
}
tmp = second;
}
}
// get result
int res = dp[0];
for(int i = 0; i < triangle.size(); ++i){
res = min(res, dp[i]);
}
return res;
}
};