LeetCode-120 三角形最小路径和 DP

题目如下:

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决思路:

#include <iostream>
#include <vector>
using namespace std;

/**
 * f(n,c) = min[f(n+1, c), f(n+1, c+1)] + data[n][c];
 */

class Solution {
public:

    // 递归 4ms
    /*
    int minimumTotal(vector<vector<int>>& triangle) {
        return helper(0, 0, triangle);

    }

    int helper(int level, int col, vector<vector<int>>& triangle){
        if (level == triangle.size() - 1){
            return triangle[level][col];
        }

        int left = helper(level + 1, col, triangle);
        int right = helper(level + 1, col + 1, triangle);
        return min(left, right) + triangle[level][col];
    }
     */

    /*
    // 记忆话搜索
    vector<vector<int>> memo;
    int minimumTotal(vector<vector<int>>& triangle) {
        memo.resize(triangle.size());
        for (int i = 0; i < triangle.size(); ++i) {
            memo[i].resize(triangle[0].size(), -1);
        }
        return helper(0, 0, triangle);
    }

    int helper(int level, int col, vector<vector<int>>& triangle){

        if (memo[level][col] != -1)
            return memo[level][col];

        if (level == triangle.size() - 1){
            memo[level][col] = triangle[level][col];
            return memo[level][col];
        }

        int left = helper(level + 1, col, triangle);
        int right = helper(level + 1, col + 1, triangle);
        memo[level][col] = min(left, right) + triangle[level][col];
        return memo[level][col];
    }
     */

    // 动态规划
    int minimumTotal(vector<vector<int>>& t) {
        vector<int> dp(t.size());
        for(int i = t.size()-1; i>=0 ; i--){
            for(int j = 0;j <= i;j++){
                dp[j] = (i == t.size()-1)?t[i][j] : t[i][j]+min(dp[j],dp[j+1]);
            }
        }
        return dp[0];
    }

};

int main() {
    vector<vector<int>> data = {
            {2},
            {3,4},
            {6,5,7},
            {4,1,8,3}
    };

    Solution solution;
    cout << solution.minimumTotal(data);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章