题目:
假设 dp[i][j] 表示从第 i+1 行第 j+1 列出来的路径和最小值
- 当 j!=0 && j!=i 时
- 当 j==0 时
- 当 j==i 时实际这题 dp 用一维数组存就够用了,每一层计算过后就不再需要,可以覆盖上一层。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <climits> #include <vector>
using std::vector;
class Solution { public: int minimumTotal(vector<vector<int>> &triangle) { int n = triangle.size(); int min = INT_MAX; vector<vector<int>> dp(n, vector<int>(n)); dp[0][0] = triangle[0][0]; for (int i = 1; i < n; i++) { for (int j = 0; j <= i; j++) { if (j == 0) { dp[i][j] = dp[i - 1][0] + triangle[i][j]; } else if (j == i) { dp[i][j] = dp[i - 1][j - 1] + triangle[i][j]; } else { dp[i][j] = std::min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]; } } } for (int j = 0; j < n; j++) { if (dp[n - 1][j] < min) { min = dp[n - 1][j]; } } return min; } };
|