三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路是重新申请一个二维数组,里面记录从顶层第一个节点到当前这个节点的最小长度,因为一个节点只能到他的下方和右下方,所以我们在求最小长度的时候只需要把当前节点的值和(上方,左上方取最小)的值相加就是到当前节点的最小值

 

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) 
    {
        int size = triangle.size();
        if(size == 0)
            return 0;
        
        int dp[size][size] = {0};
        dp[0][0] = triangle[0][0];
        for(int i = 1; i < size; i++)
        {
            for(int j = 0; j < i + 1; j++)
            {
                if(j == 0)
                {
                    dp[i][j] = triangle[i][j] + dp[i-1][j];
                }
                else if(j == i)
                {
                    dp[i][j] = dp[i-1][j-1] + triangle[i][j];
                }
                else if(j-1 >= 0)
                {
                    dp[i][j] = triangle[i][j] + std::min(dp[i-1][j], dp[i-1][j-1]);
                }
            }
        }
        int min = dp[size-1][0];
        for(int i = 1; i < size; i++)
        {
            min = (min < dp[size-1][i]) ? min : dp[size-1][i];
        }
        return min;
    }
};

上一篇:圆锥曲线中三角形面积的最值求解策略


下一篇:2019杭电多校二 1011 Keen On Everything But Triangle(主席树 + 组成三角形相关)