题目
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).
思路
这道题目要求是找出三角形中自顶向下的最小路径的和S(i)。
每一步移动的时候只能移动到下一行中的邻接点,即左下T(i+1,j)或右下 T(i+1,j+1)。
利用动态规划解决这道题目。
这道问题中的子问题是:第 i 行的最小路径和S(i),i < n ,n为三角形的行数。
状态转移方程为:S(i) = S(i-1) + min{T(i+1,j),T(i+1,j+1)}。
如果按上述步骤计算,将会产生很多重复的计算结果,并且为了计算下一行方便,使用一个中间数组sum[]来保存当前行的计算结果,然后进行下一行的计算。
从上往下计算时更新数组会比较麻烦,所以用从下往上计算的方法,直接用最后一行的值初始化sum[]。然后向上去加。这里是比较sum数组下一行中相邻两个数的大小,然后用较小的与原数组当前行的值相加。
边界值为n=0时,即三角形为空,返回0。
sum[0]就是最终的最小路径和。
代码
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
vector<int> sum(triangle[n-1]);
if(n == 0)
return 0;
for(int i = n-2; i >=0 ;i--)
{
for(int j = 0; j < n;j++)
{
if(sum[j] < sum[j+1])
sum[j] += triangle[i][j];
else
sum[j] = triangle[i][j] + sum[j+1];
}
}
return sum[0];
}
};