Cod sursa(job #2238738)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 7 septembrie 2018 12:47:17
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#define DIM 10003
using namespace std;

ifstream fin ("ferma.in");
ofstream fout ("ferma.out");
int n,k,i,j,maxi,sol,v[DIM],s[DIM],d[1001][DIM];
int main (){


    fin>>n>>k;
    for (i=1;i<=n;i++){
        fin>>v[i];
        s[i] = s[i-1] + v[i];
    }
    /// d[i][j] - productivitatea maxima daca avem i strangeri din primele j

    /// nu tinem cont ca sirul e circular
    for (i=1;i<=k;i++){
        maxi = d[i-1][i-1] - s[i-1];
        for (j=i;j<=n;j++){
            d[i][j] = max (d[i][j-1],maxi + s[j]);
            maxi = max (maxi, d[i-1][j] - s[j]); /// maxi e negativ
        }
    }

    sol = max (sol,d[k][n]);

    /// acum tinem cont ca sirul e circular si luam o secv
    /// de la inceput si una de la sfarsit

    for (i=1;i<=n;i++)
        d[1][i] = max (d[1][i-1],s[i]);


    for (i=2;i<=k;i++){
        d[i][1] = v[1]; /// incepem cu primul element
        maxi = 0;
        for (j=2;j<=n;j++){
            d[i][j] = max (d[i][j-1],s[j] + maxi);
            maxi = max (maxi,d[i-1][j] - s[j]);
        }
    }

    for (i=k;i<=n;i++)
        sol = max (sol,d[k][i] + s[n] - s[i]);

    fout<<sol;


    return 0;
}