Cod sursa(job #2345250)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 16 februarie 2019 01:18:11
Problema Ferma Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>

#define MAXN 100005

std::ifstream In ("ferma.in");
std::ofstream Out("ferma.out");

int N, K;
int SP[MAXN], DP[2][MAXN], A[2][MAXN];

void Citire() {
    In >> N >> K;
    for (int i=1, X; i<=N; ++i)
        In >> X, SP[i] = SP[i-1] + X,
        A[0][i] = std::max(SP[i], A[0][i-1]);
}

void Rezolvare() {
    int t = 0;
    for (int i=1, j, Max, Max0; i<=K; ++i, t = 1-t) {
        Max = Max0 = 0;
        for (j=1; j<=N; ++j)
            DP[t][j] = std::max(DP[t][j-1], Max + SP[j]),
            Max = std::max(Max, DP[1-t][j] - SP[j]);

        if (i!=1) {
            for (j=1; j<=N; ++j)
                A[t][j] = std::max(A[t][j-1], Max0 + SP[j]),
                Max0 = std::max(Max0, A[1-t][j] - SP[j]);
        }
    }

    int Ans = 0;
    for (int i=1; i<=N; ++i)
        Ans = std::max(Ans, std::max(DP[1-t][i], A[1-t][i] + SP[N] - SP[i]));
    Out << Ans << '\n';
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}