My idea is that going right or left reduces the triangle by one layer, and either shedsStarting from the leftmost column by going rightsecond bottom row, or the rightmost diagonal by going left. So the way to get the maximum sumeach value is to lose the least atits current value + max(left child, right child)
, which transforms each step. I do this by comparingposition in the tree to be its max path sum of the leftmost column and rightmost diagonal from the current position, then going whichever direction loses the leastthat point.
#include <iostream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <vector>
using namespace std;
using Tree = vector<vector<int>>;
constexpr bool LEFT {false};
constexpr bool RIGHT {true};
int pathsum(Tree& tree, size_t layer, size_t pos, bool right) {
int sum {};
++layer; // next level
for (; layer < tree.size(); ++layer)
if (right) sum += tree[layer][++pos];
else sum += tree[layer][pos];
return sum;
}
int max_pathsum(Tree& tree) {
int sum {};
// start from bottom size_tup, poseach {};node's value //is posnode.val inside+ amax(left layerchild, 0 isright leftmostchild)
for (size_tint layer = 0; layer < tree.size(); ++layer) {
- 2; layer >= sum0; +=--layer) tree[layer][pos];{
// going right would lose the straight left path, while going left would lose straight left
for (size_t ifpos (pathsum(tree,= layer,0; pos, LEFT) < pathsumtree[layer].size(tree, layer, pos, RIGHT); ++pos) {
++pos;
tree[layer][pos] = tree[layer][pos] + max(tree[layer+1][pos], tree[layer+1][pos+1]);
// else don't need to change position}
}
return sum;tree[0][0];
}
int main(int argc, char* argv[]) {
if (argc < 2) { cout << "Need to pass in file to read from\n"; return 1; }
ifstream f {argv[1]};
if (!f.is_open()) { cout << "Could not open file\n"; return 1; }
Tree tree;
string line;
while (getline(f, line)) {
istringstream is {line};
tree.push_back(vector<int>(istream_iterator<int>(is), istream_iterator<int>()));
}
int mps {max_pathsum(tree)};
cout << "Max path sum: " << mps << endl;
}
**EDIT**Remade max_pathsum as I thought of a much better algorithm(which works). The hint from vnp pushed me in the right direction.Starting from the second bottom row, each value is its current value + max(left child, right child), which transforms each position in the tree to be its max path sum from that point.int max_pathsum(Tree& tree) {
// start from bottom up, each node's value is node.val + max(left child, right child)
for (int layer = tree.size() - 2; layer >= 0; --layer) {
for (size_t pos = 0; pos < tree[layer].size(); ++pos) {
tree[layer][pos] = tree[layer][pos] + max(tree[layer+1][pos], tree[layer+1][pos+1]);
}
}
return tree[0][0];
}