C++算法动态规划3
第 5 题 三角形顶部到底部的最小路径和
int minimumTotal(vector<vector<int>> &triangle)
题目描述
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
最小的从顶部到底部的路径和是 2 + 3 + 5 + 1 = 11。
注意:
如果你能只用 O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中 N 是三角形中的行总数。
自顶向下求解
#include <bits/stdc++.h>
using namespace std;
int minimumTotal(vector<vector<int>> &triangle) {//矩阵构造完成初始化 F(0,0)=triangle[0][0];vector<vector<int>> minPathSum(triangle);//矩阵的行数int row=triangle.size();for(int i=1; i<row; i++) {for(int j=0; j<=i; j++) {// F(i,0)if(j==0)minPathSum[i][j]=minPathSum[i-1][j]+triangle[i][0];// F(i,j)else if(j==i)minPathSum[i][j]=minPathSum[i-1][j-1]+triangle[i][0];// F(i,i)elseminPathSum[i][j]=min(minPathSum[i-1][j],minPathSum[i-1][j-1])+triangle[i][j];}}//min(F(row-1,j)int ret=minPathSum[row-1][0];for(int i=1; i<row; i++)ret=min(ret,minPathSum[row-1][i]);return ret;
}
int main() {vector<vector<int>> triangle = {{2},{3, 4},{6, 5, 7},{4, 1, 8, 3}};cout<<minimumTotal(triangle);return 0;
}
自底向上求解
#include <bits/stdc++.h>
using namespace std;
int minimumTotal(vector<vector<int>> &triangle) {//矩阵构造完成初始化 F(row-1,j)=triangle[row-1][j];vector<vector<int>> minPathSum(triangle);//矩阵的行数int row=triangle.size();//从最后一行开始向上推导 for(int i=row-2; i>=0; i--) {for(int j=0; j<=i; j++) {minPathSum[i][j]=min(minPathSum[i+1][j],minPathSum[i+1][j+1])+triangle[i][j];}}return minPathSum[0][0];
}
int main() {vector<vector<int>> triangle = {{2},{3, 4},{6, 5, 7},{4, 1, 8, 3}};cout<<minimumTotal(triangle);return 0;
}