LeetCode 0120 Triangle【DP,数塔问题】

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:

Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.


题意

数塔最小路径和

思路1

dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]; 二维可以优化为一维

代码1

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        // 二维
        // int row = triangle.size();
        // int col = triangle[row - 1].size();
        // vector<vector<int>> dp(row);
        // for(int i = 0; i < row; i++)
        //     dp[i].resize(col);
        // for(int i = 0; i < col; i++)
        //     dp[row-1][i] = triangle[row - 1][i];
        // for(int i = row - 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];
        
        int row = triangle.size();
        int col = triangle[row - 1].size();
        vector<int> dp(col);
        for(int i = 0; i < col; i++)
            dp[i] = triangle[row - 1][i];
        for(int i = row - 2; i >= 0; i--)
        {
            for(int j = 0; j <= i; j++)
            {
                dp[j] = min(dp[j], dp[j+1]) + triangle[i][j];
            }
        }
        return dp[0];
    }
};
发布了166 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/HdUIprince/article/details/105690763