题目如下:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[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;
}