Filename: prob18.cc
//
// By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
//
// 3
// 7 4
// 2 4 6
// 8 5 9 3
//
// That is, 3 + 7 + 4 + 9 = 23.
//
// Find the maximum total from top to bottom of the triangle below:
//
// 75
// 95 64
// 17 47 82
// 18 35 87 10
// 20 04 82 47 65
// 19 01 23 75 03 34
// 88 02 77 73 07 63 67
// 99 65 04 28 06 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 04 68 89 53 67 30 73 16 69 87 40 31
// 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
//
// NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)
#include <iostream>
#include <string.h>
#include <fstream>
#include <vector>
#include <stdlib.h>
using namespace std;
vector<vector<int> > readFile(const string &filename)
{
vector<vector <int> >v;
ifstream in(filename.c_str());
if(!in)
{
cerr << "Cannot open " << filename << endl;
return v;
}
while(in)
{
vector <int> x;
char str[65536];
in.getline(str, 65536); // Delimiter defaults to newline
char * pch;
pch = strtok (str," ");
while (pch != NULL)
{
x.push_back(atoi(pch));
pch = strtok (NULL, " ");
}
v.push_back(x);
}
in.close();
return v;
}
void printTriangle(const vector<vector<int> > &v)
{
for(vector<vector <int> >::const_iterator i = v.begin();
i != v.end();
++i)
{
for(vector<int>::const_iterator j = (*i).begin();
j != (*i).end();
++j)
{
cout << *j << " ";
}
cout << endl;
}
}
inline int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
vector<vector<int> > v = readFile("prob18.txt");
printTriangle(v);
const int num_iterations = v.size()-1;
// cout << "num_iterations: " << num_iterations << endl;
for(int i=num_iterations-2; i>=0; --i)
{
// cout << "i: " << i << endl;
const vector<int> working = v.at(i);
vector<int> replacement;
for(unsigned int j=0; j<working.size(); ++j)
{
// cout << "\tj: " << j << endl;
// cout << "\t\tworking[j]: " << working.at(j) << endl;
// cout << "\t\v.at(i+1).at(j): " << v.at(i+1).at(j) << endl;
// cout << "\t\v.at(i+1).at(j+1): " << v.at(i+1).at(j+1) << endl;
replacement.push_back(working.at(j)+max(v.at(i+1).at(j),
v.at(i+1).at(j+1)));
}
v[i] = replacement;
// printTriangle(v);
}
cout << v.at(0).at(0) << endl;
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment