leetcode算法题--三角形最小路径和

原题链接:https://leetcode-cn.com/problems/triangle/
动态规划,很简单

   int minimumTotal(vector<vector<int>>& triangle) {
        int m=triangle.size();
        vector<vector<int>> dp(m,vector<int>(m,0));
        dp[0][0]=triangle[0][0];
        for(int i=1;i<m;i++){
            dp[i][0]=dp[i-1][0]+triangle[i][0];
            for(int j=1;j<i;j++) 
                dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j];
            dp[i][i]=dp[i-1][i-1]+triangle[i][i];
        }
        sort(dp[m-1].begin(),dp[m-1].end());
        return dp[m-1][0];
    }

查看了题解发现自底向上更便捷

int minimumTotal(vector<vector<int>>& triangle) {
        int m=triangle.size();
        vector<vector<int>> dp(m,vector<int>(m,0));
        dp[m-1]=triangle[m-1];
        for(int i=m-2;i>=0;i--){
            for(int j=0;j<=i;j++) 
                dp[i][j]=min(dp[i+1][j],dp[i+1][j+1])+triangle[i][j];
        }
        return dp[0][0];
    }

甚至还能直接在原对象上修改,不新建dp

    int minimumTotal(vector<vector<int>>& triangle) {
        int m=triangle.size();
        for(int i=m-2;i>=0;i--){
            for(int j=0;j<=i;j++) 
                triangle[i][j]=min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j];
        }
        return triangle[0][0];
    }
发布了75 篇原创文章 · 获赞 12 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_20817327/article/details/104988864