Cod sursa(job #1297866)

Utilizator RaduVisanRadu Visan RaduVisan Data 22 decembrie 2014 13:24:06
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 10010, KMAX = 1010, INF = 0x3f3f3f3f;

int N, K, V[NMAX], S[NMAX], Dp[KMAX][NMAX], Ans;

void DP(int Start)
{
    for(int i = Start; i <= K; ++ i)
    {
        int Max = 0;
        Dp[i][0] = -INF;
        for(int j = 1; j <= N; ++ j)
        {
            if(j < i) Dp[i][j] = -INF;
            else Dp[i][j] = max(Dp[i][j - 1], S[j] + Max);
            Max = max(Max, Dp[i - 1][j] - S[j]);
        }
    }
}

int main()
{
    freopen("ferma.in", "r", stdin);
    freopen("ferma.out", "w", stdout);

    scanf("%i %i", &N, &K);
    for(int i = 1; i <= N; ++ i) scanf("%i", &V[i]), S[i] = S[i - 1] + V[i];

    DP(1);
    Ans = Dp[K][N];

    for(int i = 1; i <= N; ++ i)
        Dp[1][i] = max(Dp[1][i - 1], S[i]);

    DP(2);

    for(int i = 1; i <= N; ++ i)
        Ans = max(Ans, Dp[K][i] + S[N] - S[i]);

    printf("%i\n", max(Ans, 0));
}