#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
// std::vector<std::vector<int>> triangle =
// {{3, -1, -1, -1},
// {7, 4, -1, -1},
// {2, 4, 6, -1},
// {8, 5, 9, 3}};
std::vector<std::vector<int>> problem =
{{75},
{95, 64},
{17, 47, 82},
{18, 35, 87, 10},
{20, 4, 82, 47, 65},
{19, 1, 23, 75, 3, 34},
{88, 2, 77, 73, 7, 63, 67},
{99, 65, 4, 28, 6, 16, 70 ,92},
{41, 41, 26, 56, 83, 40, 80, 70, 33},
{41, 48, 72, 33, 47, 32, 37, 16, 94, 29},
{53, 71, 44, 65, 25, 43, 91, 52, 97 ,51 ,14},
{70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57},
{91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48},
{63, 66, 4, 68 ,89, 53, 67, 30, 73, 16, 69, 87, 40, 31},
{4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23}};
int euler_18(std::vector<std::vector<int>> data) {
std::reverse(data.begin(), data.end());
std::vector<int> head = data[0];
std::vector<std::vector<int>> tail(data.size() - 1);
std::copy(data.begin() + 1, data.end(), tail.begin());
return std::accumulate(tail.begin(), tail.end(), head,
[](std::vector<int> v0, std::vector<int> v1){
std::vector<int> u0(v0.size() - 1);
std::vector<int> w0(v0.size() - 1);
std::vector<int> u1(v1.size());
std::copy(v0.begin(), v0.end() - 1, u0.begin());
std::copy(v0.begin() + 1, v0.end(), w0.begin());
for (unsigned long i = 0; i < v1.size(); i++) {
u1[i] = std::max(v1[i] + u0[i], v1[i] + w0[i]);
}
return u1;
})[0];
}
int main(void){
std::cout << euler_18(problem) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCi8vIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IHRyaWFuZ2xlID0KLy8gICB7ezMsIC0xLCAtMSwgLTF9LAovLyAgICB7NywgNCwgLTEsIC0xfSwKLy8gICAgezIsIDQsIDYsIC0xfSwKLy8gICAgezgsIDUsIDksIDN9fTsKCnN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IHByb2JsZW0gPQogIHt7NzV9LAogICB7OTUsIDY0fSwKICAgezE3LCA0NywgODJ9LAogICB7MTgsIDM1LCA4NywgMTB9LAogICB7MjAsIDQsIDgyLCA0NywgNjV9LAogICB7MTksIDEsIDIzLCA3NSwgMywgMzR9LAogICB7ODgsIDIsIDc3LCA3MywgNywgNjMsIDY3fSwKICAgezk5LCA2NSwgNCwgMjgsIDYsIDE2LCA3MCAsOTJ9LAogICB7NDEsIDQxLCAyNiwgNTYsIDgzLCA0MCwgODAsIDcwLCAzM30sCiAgIHs0MSwgNDgsIDcyLCAzMywgNDcsIDMyLCAzNywgMTYsIDk0LCAyOX0sCiAgIHs1MywgNzEsIDQ0LCA2NSwgMjUsIDQzLCA5MSwgNTIsIDk3ICw1MSAsMTR9LAogICB7NzAsIDExLCAzMywgMjgsIDc3LCA3MywgMTcsIDc4LCAzOSwgNjgsIDE3LCA1N30sCiAgIHs5MSwgNzEsIDUyLCAzOCwgMTcsIDE0LCA5MSwgNDMsIDU4LCA1MCwgMjcsIDI5LCA0OH0sCiAgIHs2MywgNjYsIDQsIDY4ICw4OSwgNTMsIDY3LCAzMCwgNzMsIDE2LCA2OSwgODcsIDQwLCAzMX0sCiAgIHs0LCA2MiwgOTgsIDI3LCAyMywgOSwgNzAsIDk4LCA3MywgOTMsIDM4LCA1MywgNjAsIDQsIDIzfX07CgppbnQgZXVsZXJfMTgoc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gZGF0YSkgewogIHN0ZDo6cmV2ZXJzZShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpOwogIHN0ZDo6dmVjdG9yPGludD4gaGVhZCA9IGRhdGFbMF07CiAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gdGFpbChkYXRhLnNpemUoKSAtIDEpOwogIHN0ZDo6Y29weShkYXRhLmJlZ2luKCkgKyAxLCBkYXRhLmVuZCgpLCB0YWlsLmJlZ2luKCkpOwogIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUodGFpbC5iZWdpbigpLCB0YWlsLmVuZCgpLCBoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgW10oc3RkOjp2ZWN0b3I8aW50PiB2MCwgc3RkOjp2ZWN0b3I8aW50PiB2MSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdTAodjAuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdzAodjAuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdTEodjEuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3B5KHYwLmJlZ2luKCksIHYwLmVuZCgpIC0gMSwgdTAuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29weSh2MC5iZWdpbigpICsgMSwgdjAuZW5kKCksIHcwLmJlZ2luKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IDA7IGkgPCB2MS5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxW2ldID0gc3RkOjptYXgodjFbaV0gKyB1MFtpXSwgdjFbaV0gKyB3MFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUxOwogICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF07Cn0KCmludCBtYWluKHZvaWQpewogIHN0ZDo6Y291dCA8PCBldWxlcl8xOChwcm9ibGVtKSA8PCBzdGQ6OmVuZGw7CiAgcmV0dXJuIDA7Cn0K