Cod sursa(job #490221)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 5 octombrie 2010 16:18:21
Problema Ferma Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<string.h>

#define maxim(a,b) (a>b ? a : b)

int n,k,p[10005];
int d[2][10005];
int v[10005],s[10005];

void calc(int tip)
{
    int i,j;
    
    for(i=1;i<=k;i++)
    {
        for(j=1;j<=n;j++)
            p[j]=maxim(p[j-1],d[(i-1)&1][j]-s[j]);
        if(tip && i==1)
            j=2;
        else
            j=1;
        for(;j<=n;j++)
            d[i&1][j]=maxim(d[i&1][j-1],p[j-1]+s[j]);
    }
}

int main ()
{
    int i,sol1,sol2;
    freopen("ferma.in","r",stdin);
    freopen("ferma.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        s[i]=s[i-1]+v[i];
    }
    
    calc(0);
    sol1=d[k&1][n];

    memset(d,0,sizeof(d));
    d[1][1]=v[1];
    calc(1);
    sol2=d[k&1][n];
    for(i=n-1;i>=1;i--)
        sol2=maxim(sol2,d[k&1][i]+s[n]-s[i]);
    
    printf("%d\n", maxim(0,maxim(sol1,sol2)));
    
    return 0;
}