题目描述:
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.
用动态规划,dp[i][j]表示到达(i,j)点的最小和,则有dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+val(i,j) ,行首和行尾要拎出来单独处理。
代码如下:
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle)
{
if (triangle.empty())
return 0;
int minSum;
vector<vector<int>> sum;
vector<int> line;
line.push_back(triangle[0][0]);
minSum = triangle[0][0];
sum.push_back(line);
for (int i = 1; i < triangle.size(); i++)
{
line.clear();
for (int j = 0; j < triangle[i].size(); j++)
{
int temp;
if (j == 0)
temp = sum[i - 1][j];
else if (j == triangle[i].size() - 1)
temp = sum[i - 1][j - 1];
else
temp = std::min(sum[i - 1][j - 1], sum[i - 1][j]);
line.push_back(temp + triangle[i][j]);
}
sum.push_back(line);
}
line = sum[sum.size() - 1];
minSum = line[0];
for (int i = 0; i < line.size(); i++)
minSum = std::min(minSum, line[i]);
return minSum;
}
};