題目如下:
給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
例如,給定三角形:
[
[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;
}