It is a small fun problem to solve. Since only a max sum is required (no need to print path), we can only keep track of the max value at each line. Basically it is still a human labor simulation work. To be more specifically, we need keep track of a line of max sums.
But there are 1000*100 input, so special optimization is required. The naive solution would copy data between 2 arrays, and actually that's not necessary. Logically, we only have 2 arrays - result array and working array. After one line is processed, working array can be result array for next line, so we can only switch pointers to these 2 arrays, to avoid expensive memory copy.
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int aret[100] = {0}; int atmp[100] = {0}; int proc_line(int r, int *aret, int *atmp) { if(r == 1) { int in = 0; cin >>in; aret[0] = in; atmp[0] = in; return in; } // Get current line and calc int rmax = -1; for(int i = 0; i < r; i ++) { int tmp = 0; scanf("%d", &tmp); int prevInx = i == 0 ? 0 : i - 1; int prevVal = aret[prevInx]; int currMax = (i + 1) == r ? tmp + prevVal : max(tmp + aret[i], tmp + prevVal); atmp[i] = currMax; rmax = currMax > rmax ? currMax :rmax; } return rmax; } int main() { int runcnt = 0; cin >> runcnt; while(runcnt --) { int rcnt = 0; cin >> rcnt; int ret = 0; for(int i = 1; i <= rcnt; i ++) { bool evenCase = i % 2 == 0; ret = proc_line(i, !evenCase? aret:atmp, !evenCase?atmp:aret); } cout << ret << endl; } return 0; }