描述
Given a triangle, find the minimum path sum from top to boom. 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 boom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
Note: Bonus point if you are able to do this using only O(n) extra space, where n is the total number
of rows in the triangle.
Given a triangle, find the minimum path sum from top to boom. 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 boom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
Note: Bonus point if you are able to do this using only O(n) extra space, where n is the total number
of rows in the triangle.
#include<iostream>
#include<vector>
#include<limits>
using namespace std;
bool flag = true;
int mymin(int a, int b)
{
return a < b ? a : b;
}
int Triangle(const vector<vector<int>> &input)
{
if (input.size() < 1)
{
flag = false;
return 0;
}
int len = input.size();
vector<int> sum(input[len - 1].size(), 0);
vector<int> sumcopy(input[len - 1].size(), 0);
sum[0] = input[0][0];
sumcopy[0] = input[0][0];
for (int i = 1; i < len; i++)
{
for (int j = 0; j < input[i].size(); j++)
{
if (j == 0)
sum[j] = sumcopy[j]+input[i][j];
else if (j == input[i].size() - 1)
sum[j] = sumcopy[j - 1] + input[i][j];
else
sum[j] = mymin(sumcopy[j - 1], sumcopy[j])+input[i][j];
}
sumcopy = sum;
}
int minsum = INT_MAX;
for (int i = 0; i < sum.size(); i++)
if (minsum>sum[i])
minsum = sum[i];
return minsum;
}
int main()
{
vector<int>vec1{ 2 };
vector<int>vec2{ 3,4 };
vector<int>vec3{ 6,5,7 };
vector<int>vec4{ 4,1,8,3 };
vector<vector<int>> input{ vec1, vec2, vec3, vec4 };
int minsum = Triangle(input);
if (flag)
cout << "minmum path sum:" << minsum << endl;
}