题目
给出一个三角形(数据数组),找出从上往下的最小路径和。每一步只能移动到下一行中的相邻结点上。
比如,给你如下三角形:
则从上至下最小路径和为 11(即,2 + 3 + 5 + 1 = 11)
注意:
加分项:如果你可以只使用 O(n) 的额外空间(n是三角形的行数)。
题解
普通动态规划题目,注意每一行左右两端点只有一种路径,其他的都有两种路径。
代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n=triangle.size();
if(n==0) return 0;
vector<int> dp(n,0);
int tmp1=triangle[0][0];
int minRes=INT_MAX;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
int tmp=dp[j];
if(i==0) dp[j]=tmp1;
else if(j==0){
dp[j]=dp[j]+triangle[i][j];
}
else if(j==i){
dp[j]=tmp1+triangle[i][j];
}
else {
dp[j]=min(tmp1+triangle[i][j],dp[j]+triangle[i][j]);
}
tmp1=tmp;
if(i==n-1) minRes=min(minRes,dp[j]);
}
}
return minRes;
}
};