LeetCode 120. Triangle

来源:互联网 发布:安卓php服务器汉化版 编辑:程序博客网 时间:2024/06/01 10:33

题目

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];    }};
0 0
原创粉丝点击