解题思路:
这是一个典型的动态规划问题,定义一个数组 dp,dp[i] (tmp[i]也是)表示到达当前行第 i 个元素的最小路径和。
所以只需要定义一个1维数组dp(n, 0),每循环遍历第 i 行,就更新 dp 的前 i + 1个数。所以循环内新增了一个 tmp 数组。
状态转移方程为:
tmp[j] = min(dp[j], dp[j-1]) + triangle[i][j]; 这是第 i 行,第 j 个元素的更新方程。
注意:每一行的第一个元素和最后一个元素是不满足状态转移方程的,需要单独考虑。
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
if(n == 0) return 0;
if(n == 1) return triangle[0][0];
vector<int> dp(n, 0);
dp[0] = triangle[0][0];
for(int i = 1; i < n; i++){
vector<int> tmp(i+1, 0); //第 i 行 有 i+1 个元素
tmp[0] = dp[0] + triangle[i][0]; //每一行的第一个元素
if(i >= 2){
for(int j = 1; j < i; j++){
//动态规划的状态转移方程
tmp[j] = min(dp[j], dp[j-1]) + triangle[i][j];
}
}
tmp[i] = dp[i-1] + triangle[i][i]; //每一行的最后一个元素
//更新dp
for(int j = 0; j <= i; j++){
dp[j] = tmp[j];
}
}
int res = INT_MAX;
for(int i = 0 ; i < n; i++){
if(res > dp[i]) res = dp[i];
}
return res;
}
};