原题链接:https://leetcode-cn.com/problems/triangle/
动态规划,很简单
int minimumTotal(vector<vector<int>>& triangle) {
int m=triangle.size();
vector<vector<int>> dp(m,vector<int>(m,0));
dp[0][0]=triangle[0][0];
for(int i=1;i<m;i++){
dp[i][0]=dp[i-1][0]+triangle[i][0];
for(int j=1;j<i;j++)
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j];
dp[i][i]=dp[i-1][i-1]+triangle[i][i];
}
sort(dp[m-1].begin(),dp[m-1].end());
return dp[m-1][0];
}
查看了题解发现自底向上更便捷
int minimumTotal(vector<vector<int>>& triangle) {
int m=triangle.size();
vector<vector<int>> dp(m,vector<int>(m,0));
dp[m-1]=triangle[m-1];
for(int i=m-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];
}
甚至还能直接在原对象上修改,不新建dp
int minimumTotal(vector<vector<int>>& triangle) {
int m=triangle.size();
for(int i=m-2;i>=0;i--){
for(int j=0;j<=i;j++)
triangle[i][j]=min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j];
}
return triangle[0][0];
}