Pagini recente » Cod sursa (job #2019048) | Cod sursa (job #1893640) | Cod sursa (job #2677543) | Cod sursa (job #162414) | Cod sursa (job #1769764)
#include <cstdio>
#include <iostream>
using namespace std;
int v[100001],d[100001][2];
int main()
{
FILE *fin=fopen ("oo.in","r");
FILE *fout=fopen ("oo.out","w");
int n,i,maxi,incmaxi,max0,max2;
fscanf (fin,"%d",&n);
for (i=1;i<=n;i++)
fscanf (fin,"%d",&v[i]);
// d[i][j]=suma maxima pe care o poate lua fermierul pana la poz i (inclusiv) cand ultima poz de pe care a luat e j
d[1][0]=v[n]+v[1];
d[1][1]=1;
d[2][0]=v[1]+v[2];
d[2][1]=0;
d[3][0]=v[2]+v[3];
d[3][1]=2;
maxi=d[1][0];
max0=max(d[2][0],d[3][0]);
incmaxi=d[1][1];
for (i=4;i<n-1;i++){
if (i==6)
printf ("a");
if (d[i-3][0]+v[i]+v[i-1]>maxi+v[i]+v[i-1]){
d[i][0]=d[i-3][0]+v[i]+v[i-1];
d[i][1]=d[i-3][1];
}
else {
d[i][0]=maxi+v[i]+v[i-1];
d[i][1]=incmaxi;
}
if (maxi<d[i-3][0]){
maxi=d[i-3][0];
//printf ("%d %d\n",maxi,i);
incmaxi=d[i-3][1];
}
if (d[i][1]==0){
max0=max(max0,d[i][0]);
//printf ("%d %d\n",max0,i);
}
else if (d[i][1]==2)
max2=max(max2,d[i][0]);
}
maxi=max(maxi,d[n-2][0]);
maxi=max(maxi,d[n-3][0]);
if (d[n-3][0]!=maxi && d[n-2][0]!=maxi)
maxi=max(maxi,max(max0,max2)+v[n-1]+v[n]);
if (d[n-2][0]!=maxi)
maxi=max(maxi,max2+v[n-1]+v[n]);
fprintf (fout,"%d",maxi);
return 0;
}