Cod sursa(job #3348106)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 19 martie 2026 18:23:56
Problema Oo Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("oo.in");
ofstream fout("oo.out");

#define NMAX 100000

int v[NMAX + 2];
int dp[NMAX + 1];
int maxim[NMAX + 1];

void reset_maxim(int N){
    for (int i = 1; i <= N; i++){
        maxim[i] = 0;
    }
}

int main()
{
    int N;
    fin >> N;
    for (int i = 1; i <= N; i++){
        fin >> v[i];
    }
    v[N + 1] = v[1];
    int rez = 0;
    for (int i = 1; i <= N - 2; i++){
        if (i <= 2){
            dp[i] = v[i] + v[i + 1];
            maxim[i] = max(maxim[i - 1], dp[i]);
            rez = max(rez, dp[i]);
            continue;
        }
        dp[i] = v[i] + v[i + 1] + maxim[i - 3];
        maxim[i] = max(maxim[i - 1], dp[i]);
        rez = max(rez, dp[i]);
    }
    reset_maxim(N);
    for (int i = 2; i <= N - 1; i++){
        if (i <= 3){
            dp[i] = v[i] + v[i + 1];
            maxim[i] = max(maxim[i - 1], dp[i]);
            rez = max(rez, dp[i]);
            continue;
        }
        dp[i] = v[i] + v[i + 1] + maxim[i - 3];
        maxim[i] = max(maxim[i - 1], dp[i]);
        rez = max(rez, dp[i]);
    }
    reset_maxim(N);
    for (int i = 3; i <= N; i++){
        if (i <= 4){
            dp[i] = v[i] + v[i + 1];
            maxim[i] = max(maxim[i - 1], dp[i]);
            rez = max(rez, dp[i]);
            continue;
        }
        dp[i] = v[i] + v[i + 1] + maxim[i - 3];
        maxim[i] = max(maxim[i - 1], dp[i]);
        rez = max(rez, dp[i]);
    }
    fout << rez;
    return 0;
}