Cod sursa(job #73358)

Utilizator sealTudose Vlad seal Data 18 iulie 2007 00:32:26
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#define Nm 10000
#define max(a,b) ((a)>(b)?(a):(b))
int A[Nm],n,k,sol;

void read()
{
    int i;

    freopen("ferma.in","r",stdin);
    scanf("%d%d",&n,&k);
    for(i=0;i<n;++i)
        scanf("%d",A+i);
}

void solve()
{
    int M[2][Nm],Mb[2][Nm],Me[2][Nm],Mbe[2][Nm],i,j,c,p;

    M[0][0]=Mb[0][0]=Me[0][0]=Mbe[0][0]=A[0];
    for(i=1;i<n;++i)
    {
        Me[0][i]=A[i]+max(0,Me[0][i-1]);
        M[0][i]=max(M[0][i-1],Me[0][i]);
        Mbe[0][i]=A[i]+Mbe[0][i-1];
        Mb[0][i]=max(Mb[0][i-1],Mbe[0][i]);
    }

    c=1; p=0;
    for(j=1;j<k;++j)
    {
        M[c][j]=Me[c][j]=Mb[c][j]=Mbe[c][j]=A[j]+M[p][j-1];
        for(i=j+1;i<n;++i)
        {
            Me[c][i]=A[i]+max(M[p][i-1],Me[c][i-1]);
            M[c][i]=max(M[c][i-1],Me[c][i]);
            Mbe[c][i]=A[i]+max(Mb[p][i-1],Mbe[c][i-1]);
            Mb[c][i]=max(Mb[c][i-1],Mbe[c][i]);
        }
        c^=1; p^=1;
    }

    j=0;
    for(i=n-1;i>=k;--i)
    {
        j+=A[i];
        sol=max(sol,j+Mb[p][i-1]);
    }
    sol=max(sol,M[p][n-1]);
}

void write()
{
    freopen("ferma.out","w",stdout);
    printf("%d\n",sol);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}