Cod sursa(job #749799)

Utilizator SpiderManSimoiu Robert SpiderMan Data 18 mai 2012 19:59:49
Problema A+B Scor 0
Compilator cpp Status done
Runda teme_upb Marime 2.23 kb
# include <cstdio>
# include <cstring>

long long dp[2][3][2];
int n, ind, i, r3, r2, x;

# define verf ++poz == hg ? fread ( ch, 1, hg, stdin ), poz = 0 : 0

const int hg = 1 << 13;
int poz ;
char ch[ hg ] ;

inline void cit ( int &x ) {
    if ( ch[0] == '\0' ) fread ( ch, 1, hg, stdin ) ;
    else for ( ; ch[poz] < '0' || ch[poz] > '9' ; verf ) ;
    for ( x = 0 ; ch[poz] >= '0' && ch[poz] <= '9' ; x = x * 10 + ch[poz] - '0', verf ) ;
}

inline void mx(long long &a, long long b) {
    a = a > b ? a : b;
}

const long long oo = 1LL << 61;

int main() {
    //freopen ("max.in", "r", stdin);
    freopen ("adunare.in", "r", stdin);
    cit (n); cit (x);
    long long sol = x;
    dp[1][1][1] = x;
    for (i = 2; i <= n; ++i, ind ^= 1) {
        //memset (dp[ind], -0x3f, sizeof (dp[ind]));
        dp[ind][0][0] = dp[ind][0][1] = dp[ind][1][0] = dp[ind][1][1] =
        dp[ind][2][0] = dp[ind][2][1] = -oo;
        cit (x);
        if (i >= 3)
            mx(dp[ind][0][1], dp[ind ^ 1][2][0] + 3 * x);
        if (i > 3)
            mx(dp[ind][0][1], dp[ind ^ 1][0][1]);

        if (i >= 6)
            mx(dp[ind][0][0], dp[ind ^ 1][2][1] - 3 * x);
        //if (i > 6)
            mx(dp[ind][0][0], dp[ind ^ 1][0][0]);

        mx(dp[ind][1][1], dp[ind ^ 1][0][0] + x);
        if (i > 1)
            mx(dp[ind][1][1], dp[ind ^ 1][1][1]);

        if (i >= 4)
            mx(dp[ind][1][0], dp[ind ^ 1][0][1] - x);
        if (i > 4)
            mx(dp[ind][1][0], dp[ind ^ 1][1][0]);

        if (i >= 5)
            mx(dp[ind][2][1], dp[ind ^ 1][1][0] + 2 * x);
        if (i > 5)
            mx(dp[ind][2][1], dp[ind ^ 1][2][1]);

        mx(dp[ind][2][0], dp[ind ^ 1][1][1] - 2 * x);
        if (i > 2)
            mx(dp[ind][2][0], dp[ind ^ 1][2][0]);


        for (r3 = 0; r3 < 3; ++r3)
            for (r2 = 0; r2 < 2; ++r2) {
                //mx(dp[ind][r3][r2], dp[ind ^ 1][r3][r2]),
                mx(sol, dp[ind][r3][r2]);
                //fprintf (stderr, "(%d %d %d): %d\n", i, r3, r2, dp[ind][r3][r2]);
            }

    }
    for (int i = 0; i < hg; ++i)
    ch[i] = 'a';
    fprintf (fopen ("adunare.out", "w"), "0");
    //fprintf (fopen ("max.out", "w"), "%lld\n", sol);
}