题目
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
分析
动态规划求解
思路1:
建立一个二维数组,每次记录走到当前位置时的最短路径。
求解是自上而下的。
思路2:
该问题有重叠子问题,因此申请O(n)的空间
可以自底向上求解。
实现
实现一:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if (triangle.size() == 0 || triangle[0].size() == 0)
return 0;
int len = triangle.size() + 1;
vector<vector<int>> tmp(len, vector<int>(len, INT16_MAX ));
tmp[0][0] = 0;
for (int i = 1; i<len; i++)
for (int j = 1; j <= i; j++)
{
int x = triangle[i - 1][j - 1];
int y = min(tmp[i - 1][j-1], tmp[i-1][j]);
tmp[i][j] = y +x ;
}
int path = INT16_MAX;
for (int k = 1; k<len; k++)
if (tmp[len - 1][k]<path)
path = tmp[len - 1][k];
return path;
}
};
实现二
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
vector<int> res(triangle.back());
for(int i = n-2;i>=0;i--)
for(int j = 0;j<=i;j++ )
res[j] = min(res[j],res[j+1])+triangle[i][j];
return res[0];
}
};