Cod sursa(job #2079982)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 2 decembrie 2017 11:12:04
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>
#define INF 200000
using namespace std;
int v[10001],s[10001];
int d[1002][10001];
int main()
{
    FILE *fin=fopen ("ferma.in","r");
    FILE *fout=fopen ("ferma.out","w");
    int val,i,j,sol,n,k;
    fscanf (fin,"%d%d",&n,&k);
    for (i=1;i<=n;i++){
        fscanf (fin,"%d",&v[i]);
        s[i]=s[i-1]+v[i];
    }
    for (i=1;i<=k;i++){
        val=0;
        for (j=1;j<=n;j++){
            d[i][j]=max(d[i][j-1],val+s[j]);
            val=max(val,d[i-1][j]-s[j]);
            // val = suma (pe minus) a elem pe care nu le am luat
        }
    }
    sol=d[k][n]; // asta e sol fara cazul in care ma fol de faptul ca e un cerc
    // incerc sa iau si o secv care se termina pe n si una care incepe pe 1
    for (i=1;i<=n;i++)
        d[1][i]=max(d[1][i-1],s[i]); // e obligatoriu sa iau si ceva de la inceput
    for (i=2;i<=k;i++){
        val=0;
        d[i][1]=v[1]; // trb sa incep cu 1
        for (j=2;j<=n;j++){
            d[i][j]=max(d[i][j-1],val+s[j]);
            val=max(val,d[i-1][j]-s[j]);
        }
    }
    val=0;
    for (i=1;i<=n;i++)
        val=max(val,d[k][i]-s[i]);
    // val e minimul pe care nu il iau in considerare
    fprintf (fout,"%d",max(sol,s[n]+val));
    return 0;
}