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];
    }
};

猜你喜欢

转载自www.cnblogs.com/llzhh/p/10178949.html
今日推荐