class Solution {
public:
int dp[1000][1000];
int minimumTotal(vector<vector<int>>& triangle) {
//基本思想,动态规划,思路自顶向下,或自底向上,
//先考虑自顶向下,用dp[i][j]二维数组维护,到达每个节点的最短路径,dp[i][j]=min(dp[i-1][j-1]
//,dp[i-1][j])+triangle[i][j])
//返回最后一行元素的最小值
//int **dp=new int*[1000];//用来保存到第i行的最小路径
dp[0][0]=triangle[0][0];
int len=triangle.size();
for(int i=1;i<len;++i){
for(int j=0;j<triangle[i].size();++j){
if(j==0){
dp[i][j]=dp[i-1][j]+triangle[i][j];
}
else if(j==triangle[i].size()-1){
dp[i][j]=dp[i-1][j-1]+triangle[i][j];
}
else{
dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j];
}
}
}
int minus=0xffffff;
for(int j=0;j<triangle[len-1].size();++j){
// printf("%d ",dp[len-1][j] );
minus=min(minus,dp[len-1][j]);
}
return minus;
}
};
缺点:空间复杂度较高,但是针对此问题还可以对空间复杂度进行改进。另外,对于dp不仅可以使用全局变量保存(优点,均初始化为0,缺点存在浪费),也可以动态开辟数组,另外还可以使用vector模板,但个人认为后两者的时间效率不如前者。