您的位置:首页 > 其它

SPOJ #453. Sums in a Triangle (tutorial)

2014-02-09 13:37 351 查看
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;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: