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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章