Problem18

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

#define NUM "\
75\n\
95 64\n\
17 47 82\n\
18 35 87 10\n\
20 04 82 47 65\n\
19 01 23 75 03 34\n\
88 02 77 73 07 63 67\n\
99 65 04 28 06 16 70 92\n\
41 41 26 56 83 40 80 70 33\n\
41 48 72 33 47 32 37 16 94 29\n\
53 71 44 65 25 43 91 52 97 51 14\n\
70 11 33 28 77 73 17 78 39 68 17 57\n\
91 71 52 38 17 14 91 43 58 50 27 29 48\n\
63 66 04 68 89 53 67 30 73 16 69 87 40 31\n\
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23"

int
main(int argc, char **argv)
{
    string s(NUM);
    istringstream is(s);
    vector<int> v;

    bool f = true;
    for (int l = 1, n = 0; f; l++)
    {
        v.resize(l);
        vector<int> v_tmp(v.size());
        for (int i = 0; i < l; i++)
        {
            if (is >> n)
            {
                if (l == 1)
                {
                    v_tmp[i] = n;
                }
                else
                {
                    if (i == 0)
                    {
                        v_tmp[i] = v[i]+n;
                    }
                    else if (i == l-1)
                    {
                        v_tmp[i] = v[i-1]+n;
                    }
                    else
                    {
                        if (v[i-1] > v[i])
                        {
                            v_tmp[i] = v[i-1]+n;
                        }
                        else
                        {
                            v_tmp[i] = v[i]+n;
                        }
                    }
                }
            }
            else
            {
                f = false;
            }
        }
        if (!f)
        {
            continue;
        }
        v.swap(v_tmp);
        for (int i = 0; i < l; i++)
        {
            cout << v[i] << " ";
        }
        cout << endl;
    }

    int max = -1;
    for (vector<int>::iterator it = v.begin(), end = v.end(); it != end; it++)
    {
        if (max < *it)
        {
            max = *it;
        }
    }
    cout << max << endl;

    return 0;
}