Cod sursa(job #772379)

Utilizator vendettaSalajan Razvan vendetta Data 29 iulie 2012 13:53:28
Problema Ferma Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("ferma.in");
ofstream g("ferma.out");

#define nmax 10005
#define Kmax 1005

int n, k, a[2*nmax], dp[nmax][Kmax], s[2*nmax];

void citeste(){

    f >> n >> k;
    for(int i=1; i<=n; i++) f >> a[i], s[i] = s[i-1]+a[i];

    for(int i=n+1; i<=2*n-1; i++) a[i] = a[i-n], s[i] = s[i-1]+a[i];//dublez vectorul pentru a fi circular

}

int suma(int i, int j){

    int s = 0;

    for(int x=i; x<=j; x++) s += a[x];

    return s;

}

void rezolva(){

    //dp[i][j] = numarul maxim de gaini din primele i sectoare avand j treceri


    int rez = 0;
    for(int poz=1; poz<=n; poz++){//iau fiecare pozitie ca si pozitie de inceput
        for(int w=0; w<=n; w++){
            for(int j=1; j<=k; j++) dp[w][j] = 0;
        }
        dp[1][1] = max(0, a[poz]);
        for(int i=poz+1, cpy=2; i<=n+poz-1; i++, cpy++){
            for(int j=1; j<=k; j++){
                dp[cpy][j] = dp[cpy-1][j];
                for(int kk=i, kk2=cpy; kk>=poz+1; kk--,kk2--){
                    dp[cpy][j] = max(dp[cpy][j], (s[i]-s[kk-1]) + dp[kk2-1][j-1]);
                }
            }
        }
        int Max = 0;

        Max = dp[n][k];

        if (rez < Max ) rez = Max;
    }

    g << rez << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}