leetcode120. 三角形最小路径和
这道题的关键在于想到
dp[i][j] = min(dp[i-1][j-1] , dp[i-1][j]) + triangle[i][j];
太久没做过算法题了,连设一个dp数组都没意识到
我的代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int size = triangle.size();
if(size==1) return triangle[0][0];
vector<vector <int> > dp(size,vector<int>(size));
dp[0][0] = triangle[0][0];
for(int i = 1;i < size;i++)
{
for(int j = 0;j <= i ;j++)
{
if(j == 0) dp[i][j] = dp[i-1][j] + triangle[i][j];
else if(j == i) dp[i][j] = dp[i-1][j-1] + triangle[i][j];
else dp[i][j] = min(dp[i-1][j-1] , dp[i-1][j]) + triangle[i][j];
}
}
int res = dp[size-1][0];
for(int i = 1;i <= size-1 ; i++) res = min(res,dp[size-1][i]);
return res;
}
};
2025/03/12 二刷代码:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int size = triangle.size();
vector<vector<int>> dp(triangle);//dp[i][j]表示从triangle[0][0]到triangle[i][j]的最小路径和
for(int i = 1;i < size;++i){
dp[i][0] = triangle[i][0] + dp[i-1][0];
dp[i][i] = triangle[i][i] + dp[i-1][i-1];
for(int j = 1;j < i;++j){
dp[i][j] = triangle[i][j] + min(dp[i-1][j-1],dp[i-1][j]);
}
}
int res = INT_MAX;
for(int &num : dp[size-1]) res = min(res,num);
return res;
}
};