给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[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;
}
};