Leetcode 三角形最小路径和
很经典的DP题了,数塔问题。如果从上往下处理边界比较麻烦,如果从下往上看就会简单很多。
分析:1.我们要找到最底层到最高层一条路,使得和最大。显然,如果我们从上往下,那么转移条件就是dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];这样的麻烦在于,我们要特判每行第一个,否则i-1越界。
2.如果我们从下往上就可以避免这个问题,此时转移方程为dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j];由于i+1行比第i行长一格,所以不会越界。两种写法其实都是可以接受的。
3.显然,当前行的状态只需要上一次的状态即可,利用二维滚动数组可以写出来,此时空间复杂度O(2*n)。再分析第二条所写的,更新第 j 列只需要 j 和 j+1 列的内容,更新时直接覆盖掉第 j 列是可行的,所以还可以继续缩小成只有一行的递推数组,依然满足要求,此时空间复杂度O(n)。
const int INF = 0x3f3f3f3f; class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { vector<int>dp; dp.resize(triangle.size() + 5); int len = triangle.size(); for(int i = 0; i < len; ++i) dp[i] = triangle[len - 1][i]; for(int i = len - 2; i >= 0; --i) { for(int j = 0; j < triangle[i].size(); ++j) { dp[j] = triangle[i][j] + min(dp[j], dp[j + 1]); } } return dp[0]; } };