Cod sursa(job #40703)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 27 martie 2007 17:41:46
Problema Oo Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
# include <stdio.h>

const long int MAXN=100000;

int v[MAXN+1];
long int nr[MAXN+1],n;

void citire()
{
FILE *f=fopen("oo.in","r");
fscanf(f,"%ld",&n);
long int i;
for (i=1;i<=n;i++) fscanf(f,"%d",&v[i]);
fclose(f);
}

void scrie(long int sol)
{
FILE *g=fopen("oo.out","w");
fprintf(g,"%ld\n",sol);
fcloseall();
}

long int maxim(int s1, int s2, int s3)
{
if (s1>s2&&s1>s3) return (long int)s1;
if (s2>s1&&s2>s3) return (long int)s2;
return (long int)s3;
}

long int max(long int a, long int b) {if (a>b) return a; return b;}

long int solve()
{
long int i,sol=0;
if (n==2) return v[1]+v[2];
if (n==3) return maxim(v[1]+v[2],v[2]+v[3],v[3]+v[1]);
//stabilim un inceput; sa zicem ca ia din 1 si 2
nr[2]=v[1]+v[2];sol=max(sol,nr[2]);
for (i=4;i<=n-1;i++)
	{
	nr[i]=max(nr[i-1],nr[i-3]+v[i]+v[i-1]);
	sol=max(sol,nr[i]);
	}
//sa zicem ca ia din 2 si 3
nr[3]=v[3]+v[2];sol=max(sol,nr[3]);nr[4]=0;
nr[1]=0;
for (i=5;i<=n;i++)
	{
	nr[i]=max(nr[i-1],nr[i-3]+v[i]+v[i-1]);
	sol=max(sol,nr[i]);
	}
//sa zicem ca ia din 3 si 4
nr[4]=v[3]+v[4];sol=max(sol,nr[4]);
nr[1]=nr[2]=0;nr[5]=0;
for (i=6;i<=n;i++)
	{
	nr[i]=max(nr[i-1],nr[i-3]+v[i]+v[i-1]);
	sol=max(sol,nr[i]);
	}
if (n>=6)
	{
	nr[1]=max(nr[n],v[1]+v[n]+nr[n-2]);
	sol=max(sol,nr[1]);
	}
return sol;
}

int main()
{
citire();
long int sol=solve();
scrie(sol);
return 0;
}