uacs2024

导航

leetcode120. 三角形最小路径和

leetcode120. 三角形最小路径和

这道题的关键在于想到

dp[i][j] = min(dp[i-1][j-1] , dp[i-1][j]) + triangle[i][j];

太久没做过算法题了,连设一个dp数组都没意识到

我的代码

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int size = triangle.size();
        if(size==1) return triangle[0][0];
        vector<vector <int> > dp(size,vector<int>(size)); 

        dp[0][0] = triangle[0][0];     
        for(int i = 1;i < size;i++)
        {
            for(int j = 0;j <= i ;j++)
            {
                if(j == 0) dp[i][j] = dp[i-1][j] + triangle[i][j];
                else if(j == i) dp[i][j] = dp[i-1][j-1] + triangle[i][j];
                else dp[i][j] = min(dp[i-1][j-1] , dp[i-1][j]) + triangle[i][j];
            }
        }
        int res = dp[size-1][0];
        for(int i = 1;i <= size-1 ; i++)  res = min(res,dp[size-1][i]);
        return res;
    }
};

 2025/03/12 二刷代码:

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int size = triangle.size();
        vector<vector<int>> dp(triangle);//dp[i][j]表示从triangle[0][0]到triangle[i][j]的最小路径和
        for(int i = 1;i < size;++i){
            dp[i][0] = triangle[i][0] + dp[i-1][0];
            dp[i][i] = triangle[i][i] + dp[i-1][i-1];
            for(int j = 1;j < i;++j){
                dp[i][j] = triangle[i][j] + min(dp[i-1][j-1],dp[i-1][j]);
            }
        }
        int res = INT_MAX;
        for(int &num : dp[size-1])  res = min(res,num);
        return res;
    }
};

 

posted on 2024-03-07 17:43  ᶜʸᵃⁿ  阅读(9)  评论(0)    收藏  举报