原题地址:https://leetcode-cn.com/problems/triangle/
题目描述:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
解题方案:
还是经典的动态规划,但是我开始下标算错了,导致找了半天哪出错。
代码:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int h = triangle.size();
if(h == 0)
return 0;
if(h == 1)
return triangle[0][0];
vector<vector<int>> dp;
dp.push_back(triangle[0]);
vector<int> a;
a.push_back(triangle[1][0] + dp[0][0]);
a.push_back(triangle[1][1] + dp[0][0]);
dp.push_back(a);
for(int i = 2; i < h; i ++)
{
vector<int> b;
for(int j = 0; j <= i; j ++)
{
if(j == 0)
b.push_back(triangle[i][j] + dp[i - 1][j]);
else if(j == i)
b.push_back(triangle[i][j] + dp[i - 1][j - 1]);
else
{
int tmp = (triangle[i][j] + dp[i - 1][j - 1]) <
(triangle[i][j] + dp[i - 1][j]) ?
(triangle[i][j] + dp[i - 1][j - 1]) :
(triangle[i][j] + dp[i - 1][j]);
b.push_back(tmp);
}
}
dp.push_back(b);
}
int min = dp[h - 1][0];
for(int i = 1; i <= h - 1; i ++)
{
if(min > dp[h - 1][i])
min = dp[h - 1][i];
cout << min << endl;
}
return min;
}
};