Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

 

posted on 2014-02-09 13:37  Tonix  阅读(417)  评论(0编辑  收藏  举报