题目:120
题意:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
题解:
方法一:动态规划,使用O(n)的额外辅助空间,自顶向下,从后往前,需要考虑边界
方法二:动态规划,使用O(n)的额外辅助空间,自底向上,从前往后,不需要考虑边界
代码一:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
if (n == 0)return 0;
vector<int> v(n, 0);
//边界
v[0] = triangle[0][0];
//状态转移方程
for (int i = 1; i < n; ++i) {
v[i] += triangle[i][i] + v[i-1];
for (int j = i - 1; j > 0; --j) {
v[j] = min(v[j],v[j-1])+ triangle[i][j];
}
v[0] += triangle[i][0];
}
int ans = v[0];
for (int i = 0; i < n; ++i)
if (v[i] < ans)
ans = v[i];
return ans;
}
};
代码二:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
if (n == 0)return 0;
vector<int> v(n + 1, 0);
//状态转移方程
for (int i = n - 1; i >= 0; --i)
for (int j = 0; j <= i; ++j)
v[j] = min(v[j], v[j + 1]) + triangle[i][j];
return v[0];
}
};