思路:自顶向下依次累加,简单的动态规划算法。第i层的第j列元素只考虑第i-1层第j 和 第 j-1列元素(如果存在),注意数组不要越界。为了节省空间,可以只记录两层的最小和,当前层和前一层,但是会消耗一些时间。
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
int layer = triangle.size();
int *f = new int[layer], *pre = new int[layer];
for(int i = 0;i<layer;i++){
if(0 == i) {pre[0] = f[0] = triangle[0][0];}
else{
for(int j = 0;j<=i;j++){
if(0==j)
f[j] = pre[j] + triangle[i][j];
else if(j == i)
f[j] = pre[j-1] + triangle[i][j];
else
f[j] = min(pre[j],pre[j-1]) + triangle[i][j];
}
for(int j=0;j<=i;j++)
pre[j] = f[j];
}
}
int min_v = INT_MAX;
for(int i=0;i<layer;i++)
min_v = min(min_v,f[i]);
return min_v;
}
};