问题描述:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
[2], [3,4], [6,5,7], [4,1,8,3]自顶向下的最小路径和为
11
(即,2 + 3 + 5 + 1 = 11)。
//自底向上
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
//自底向上,可以避免越界问题
vector<int> dp(triangle[n-1]);
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[j] = triangle[i][j]+min(dp[j],dp[j+1]);
}
}
return dp[0];
}
};
//自顶向下
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int len = triangle.size();
if(len == 1)
return triangle[0][0];
vector<vector<int>> dp(len,vector<int>(len,0));
dp[0][0] = triangle[0][0];
for(int i=1;i<len;i++){
for(int j=0;j<=i;j++){
if(j==0){
dp[i][j]=dp[i-1][j]+triangle[i][j];
}
else if(j==i){
dp[i][j]=dp[i-1][j-1]+triangle[i][j];
}
else{
dp[i][j]=min(dp[i-1][j-1]+triangle[i][j],dp[i-1][j]+triangle[i][j]);
}
}
}
sort(dp[len-1].begin(),dp[len-1].end());
return dp[len-1][0];
}
};