思路:动态规划
定义:dp[i][j]表示走到trigle[i][j]位置的最小路径
状态转移方程:dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+trigle[i][j]
因为j依赖于j-1,所以j要从后往前遍历
要考虑
- 第一个元素:j==0,只能从[i-1][j]到达[i][j]
- 最后一个元素:j==i,只能从[i-1][j-1]到达[i][j]
- 最后遍历dp得到最小值。dp的长度和trigle的长度相等,也跟(teigles.end()-1),即最后一排的长度相等。
代码:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
//转移方程:dp[i][j]=min(dp[i-1][j-1],dp[i-1][j]);
vector<int> dp((triangle.end()-1)->size(),0);
dp[0]=triangle[0][0];
for(int i=1;i<triangle.size();i++)
{
for(int j=i;j>=0;j--){
if(j==0) dp[j]+=triangle[i][j];
else if(j==i) dp[j]=dp[j-1]+triangle[i][j];
else dp[j]=min(dp[j-1],dp[j])+triangle[i][j];
}
}
int min=INT_MAX;
for(int i=0;i<dp.size();i++)
if(min>dp[i]) min=dp[i];
return min;
}
};