[LeetCode]120. Triangle
题目描述
思路
动归,新建一个状态保存数组
原数组 | 状态数组 |
---|---|
2 | 2 |
3 4 | 5 6 |
6 5 7 | 11 10 13 |
4 1 8 3 | 15 11 18 16 |
所以结果是11
代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
vector<vector<int>> dp;
dp.push_back(*triangle.begin());
for (int i = 0; i < triangle.size() - 1; ++i) {
vector<int> num = {};
dp.push_back(num);
for (int j = 0; j < triangle[i].size(); ++j) {
if (j == 0) {
dp[i + 1].push_back(dp[i][j] + triangle[i + 1][j]);
}
else {
if(dp[i][j] + triangle[i + 1][j] < dp[i + 1][j])
dp[i + 1][j] = dp[i][j] + triangle[i + 1][j];
}
dp[i + 1].push_back(dp[i][j] + triangle[i + 1][j + 1]);
}
}
int min = dp[dp.size() - 1][0];
for (auto &p : dp[dp.size() - 1]) {
min = p < min ? p : min;
}
return min;
}
};
更新
思路update
节省空间考虑
状态数组可以从下往上算
原数组 | 状态数组 |
---|---|
4 1 8 3 | 4 1 8 3 |
6 5 7 | 7 6 10 |
3 4 | 9 10 |
2 | 11 |
代码update
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int len = triangle.size();
vector<int> dp(triangle[len - 1].begin(), triangle[len - 1].end());
for (int i = len - 2; i >= 0; --i)
for (int j = 0; j < i + 1; ++j)
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1]);
return dp[0];
}
};