三角形的最小路径和

120. 三角形最小路径和

自顶向下

三角形的最小路径和_第1张图片
来源 LeetCode:三角形最小路径和

状态转换:
dp[i][j] = min{dp[i-1][j], dp[i-1][j+1]} ( 1< j < len(triangle(i-1)) - 1)
以下是最开始的代码,不简洁也不整洁,实不相瞒我自己再看的时候都蒙了,后续整理了下
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        // 与最短路径相同,只是要比较最后一行的数据
        // 
        // dp[i][j] = min{dp[i-1][j], dp[i-1][j+1]} ( 1< j < len(triangle(i-1)) - 1)
        int col = triangle.size(); // 总行数
        vector<int> dp(col, 0); // 一维dp数组
        int rst = 0; // 返回值
        // 初始化
        if(col > 1)
        {
            dp[0] = triangle[0][0];
            int outer_tag = col; --outer_tag; 
            for(int i=0; i<outer_tag;++i) // 指示上一层的数据
            {
                int col_cur = i; ++col_cur;
                int len = triangle[col_cur].size(); //该行的长度 
                dp[len-1] = dp[len-2] + triangle[col_cur][len-1];
                for(int j=len-2; j> 0;--j)
                    dp[j] = triangle[col_cur][j] + min(dp[j], dp[j-1]); // 从后向前
                dp[0] += triangle[col_cur][0]; // 首元素
            }
            rst = dp[0];
            for(int i=1; i<col; ++i){
                rst = min(rst, dp[i]);
            } 
        }
        else
        {
            int len = triangle[0].size();
            if(len>0)
            {
                rst = triangle[0][0];
                for(int i=1; i<len; ++i) rst = min(rst, triangle[0][i]);
            }
        }
        return rst;
    }
};
上述代码采用的是从上向下
可以改成自底向上,即从多个点出发走到triange[0][0],直接用原数组

自底向上

状态转化方程:
dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangele[i][j];
dp 直接用triangle
triangle[i][j] += min(dp[i-1][j], dp[i+1][j+1])
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        for(int i=triangle.size()-2; i>=0; --i){
            for(int j=0; j<triangle[i].size(); ++j){
                triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]);
            }
        }
        return triangle.size() == 0 ? 0 : triangle[0][0];
    }
};
有没有瞬间简介不少,不过实际上自顶向下也可以的甚至也不需要额外数组只要选好遍历方向就可以
但我当时太菜了
自顶向下就不改了,提醒自己代码简介多么重要

你可能感兴趣的:(LeetCode总结,DP,#,线性DP)