解法一:以triangle自己为dp数组,状态转移方程为triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j]) + triangle[i[j]
,而位于边界的结点则是直接加上上一层的值。code
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int i,j,size = triangle.size(); if(size < 1) return 0; for(i = 1;i < size;i++) { int len = triangle[i].size(); for(j = 0;j < len;j++) { if(j == 0) triangle[i][j] += triangle[i-1][j]; else if(j == len-1) triangle[i][j] += triangle[i-1][j-1]; else triangle[i][j] += min(triangle[i-1][j-1],triangle[i-1][j]); } } return *min_element(triangle[size-1].begin(),triangle[size-1].end()); } };
解法二:解法一虽然不用开辟新的空间,可是修改了原数组。能够复制三角形最后一行,做为用来更新的一维数组,而后逐个遍历这个DP数组,对于每一个数字,和它以后的元素比较选择较小的再加上面一行相邻位置的元素作为新的元素,而后一层一层的向上扫描。blog
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int i,j,size = triangle.size(); vector<int> dp(triangle[size-1]); for(i = size-2;i >= 0;i--) { for(j = 0;j <= i;j++) { dp[j] = min(dp[j],dp[j+1])+triangle[i][j]; } } return dp[0]; } };