算法思路:
1.设置一个二维数组,最优值三角形dp[][],并初始化数组元素为0。dp[i][j]代表了从底向上递推时,走到三角形第i行第j列的最优解
2.从三角形的底面向三角形上方进行动态规划:
a.动态规划边界条件:底面上的最优值即为数字三角形的最后一层
b.利用i循环,从倒数第二层递推至第一层,对于每层的各列,进行动态规划递推:
第i行,第j列的最优解为dp[i][j],可到达(i,j)的两个位置的最优解为dp[i+1][j],dp[i+1][j+1]。
dp[i][j] = min( dp[i+1][j], dp[i+1][j+1] ) + triangle[i][j]
3.返回dp[0][0]
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 0)
return 0;
vector<vector<int> > dp;
//初始化dp数组为0,维数和三角形数组一样
for(int i = 0;i<triangle.size();++i)
{
dp.push_back(vector<int>());
for(int j = 0;j <triangle[i].size();++j)
{
dp[i].push_back(0);
}
}
//dp数组的最后一行就是三角形数组的最后一行
for(int i = 0;i<triangle[triangle.size()-1].size();++i)
dp[dp.size()-1][i] = triangle[triangle.size()-1][i];
//从倒数第二行开始,往上递推
for(int i = dp.size() - 2;i>=0;--i)
{
for(int j = 0;j<dp[i].size();++j)
dp[i][j] = min(dp[i+1][j],dp[i+1][j+1]) + triangle[i][j];
}
return dp[0][0];
}
};