Cod sursa(job #41413)

Utilizator raula_sanChis Raoul raula_san Data 28 martie 2007 11:37:57
Problema Oo Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

#define dim 100001

long N, s1, s2, s3, Sol;
long d[dim], n[dim];

int A[dim];

void Read();
void Solve();
void Write();

long max(long, long);

int main()
{
    Read();
    Solve();
    Write();
    
    return 0;
}

void Read()
{
     freopen("oo.in", "r", stdin);

     scanf("%ld", &N);

     long i;
     
     for(i=1; i<=N; ++i)
              scanf("%d", A+i);
              
     fclose(stdin);
}

void Solve()
{
     long i;
     
     for(i=3; i<=N; ++i)
     {
              d[i] = A[i] + A[i-1] + n[i-2];
              n[i] = max(n[i-1], d[i-1]);
     }
     
     s1 = d[N] > n[N] ? d[N] : n[N];
     
     for(i=3; i<=N; ++i)
              d[i] = n[i] = 0;
              
     for(i=2; i<N; ++i)
     {
              d[i] = A[i] + A[i-1] + n[i-2];
              n[i] = max(n[i-1], d[i-1]);
     }
     
     s2 = d[N-1] > n[N-1] ? d[N-1] : n[N-1];
     
     for(i=2; i<N; ++i)
              d[i] = n[i] = 0;
     
     A[0] = A[N];
     
     for(i=1; i<=N-2; ++i)
     {
              d[i] = A[i] + A[i-1] + n[i-2];
              n[i] = max(n[i-1], d[i-1]);
     }
     
     s3 = d[N-2] > n[N-2] ? d[N-2] : n[N-2];
     
     Sol = max(max(s1, s2), s3);
}

void Write()
{
     freopen("oo.out", "w", stdout);
     
     printf("%ld", Sol);
     
     fclose(stdout);
}

long max(long a, long b)
{
     return
           a > b ? a : b;
}