快樂做一個DP廚。
二維樸素解法
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int mm=INT_MAX;
int level=triangle.size();
vector<vector<int>> dp(level+1,vector<int>(triangle[level-1].size()+1,INT_MAX));
dp[1][1]=triangle[0][0];
for(int i=2;i<=level;i++)
{
for(int j=1;j<=triangle[i-1].size();j++)
{
dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i-1][j-1];
}
}
for(int i=1;i<dp[0].size();i++)
{
mm=min(mm,dp[level][i]);
}
return mm;
}
};
一維壓縮
dp[j]:表示行中的第j個元素能達到的最小值。
自底而上計算。
例如題中測試樣例
4 1 8 3 0
7 6 10 3 0
9 10 10 3 0
11 10 10 3 0
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int level=triangle.size();
vector<int> dp(level+1,0);
for(int i=level-1;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
dp[j]=min(dp[j+1],dp[j])+triangle[i][j];
}
}
return dp[0];
}
};