分析
一开始的想法非常愚蠢,定义dp[n][2],dp[i][0]来代表自顶向下到第n行的最小路径和,dp[i][1]代表最小路径和到的下标位置i; 实在是太蠢了,定义了这么个麻烦的dp数组,因此代码也相当的丑陋。。。
实际上自底向上去推是非常简单的,定义dp[i][j]为到坐标为(i,j)的位置上时的最小路径和;
自底向上,到每个元素位置的最小值可以由下一层来推出,推到dp[0][0]就是答案
代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
vector<vector<int>> dp(n,vector<int>(n,0));
for(int i=0;i<n;i++)
dp[n-1][i] = triangle[n-1][i];
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
dp[i][j] = min(dp[i+1][j],dp[i+1][j+1]) + triangle[i][j];
}
}
return dp[0][0];
}
};