方法一:直接在原数组里进行操作
int minimumTotal(std::vector<std::vector<int>>& triangle) {
if(triangle.size()==0)
return 0;
if(triangle.size()==1)
return triangle[0][0];
for(int i=1;i<triangle.size();i++){
for(int j=0;j<triangle[i].size();j++){
if(j==0)
triangle[i][j]=triangle[i-1][j]+triangle[i][j];
else if(j==triangle[i].size()-1)
triangle[i][j]=triangle[i-1][j-1]+triangle[i][j];
else
triangle[i][j]=triangle[i][j]+std::min(triangle[i-1][j-1],triangle[i-1][j]);
}
}
long min=INT64_MAX;
for(int i=0;i<triangle[triangle.size()-1].size();i++){
if(min>triangle[triangle.size()-1][i])
min=triangle[triangle.size()-1][i];
}
return min;
}
方法二:
int minimumTotal(std::vector<std::vector<int>> &triangle) {
int n=triangle.size();
std::vector<int> dp(triangle.back());
for(int i=n-2;i>=0;i--){
for(int j=0;j<=i;j++){
dp[j]=std::min(dp[j],dp[j+1])+triangle[i][j];
}
}
return dp[0];
}