Cod sursa(job #2490874)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 11 noiembrie 2019 11:11:10
Problema Oo Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("oo.in");
ofstream g("oo.out");

const int NMAX = 1e5 + 10;

int N, A[NMAX];

int dp[NMAX], ans;

static inline void Read ()
{
    f.tie(NULL);

    f >> N;

    for(int i = 1; i <= N; ++i)
        f >> A[i];

    return;
}

static inline void Solve1 () /// 1 + 2:
{
    dp[1] = A[1] + A[2];
    dp[2] = dp[1];

    for(int i = 3; i < N - 1; ++i)
        dp[i] = max(dp[i - 3] + A[i] + A[i + 1], dp[i - 1]);

    ans = dp[N - 2];

    return;
}

static inline void Solve2 () /// 1 + N:
{
    memset(dp, 0, sizeof(dp));

    dp[1] = A[N] + A[1];
    dp[2] = dp[1];

    for(int i = 3; i < N - 1; ++i)
        dp[i] = max(dp[i - 3] + A[i] + A[i + 1], dp[i - 1]);

    ans = max(ans, dp[N - 2]);

    return;
}

static inline void Solve3 () /// 2 + 3:
{
    memset(dp, 0, sizeof(dp));

    dp[1] = 0;
    dp[2] = A[2] + A[3];
    dp[3] = dp[2];

    for(int i = 4; i < N; ++i)
        dp[i] = max(dp[i - 3] + A[i] + A[i + 1], dp[i - 1]);

    ans = max(ans, dp[N - 1]);

    return;
}

int main()
{
    Read();

    Solve1();
    Solve2();
    Solve3();

    g << ans << '\n';

    return 0;
}