LeetCode 120. Triangle

题目

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值