Cod sursa(job #998948)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 18 septembrie 2013 20:10:52
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <cassert>

#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define chmax(a, b) a = max(a, b)
#define chmin(a, b) a = min(a, b)
#define ll long long
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define sz size
#define DBG(X) cerr << X << "\n";

using namespace std;

int N, K;
int dp[1024][10100], x[10100];
ll SP[10100];

int DP(int i) {
    for (; i <= K; ++i) {
        int best = 0;
        for (int j = 1; j <= N; ++j) {
            dp[i][j] = max(dp[i][j - 1], SP[j] + best);
            chmax(best, dp[i - 1][j] - SP[j]);
        }
    }
    return dp[K][N];
}

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

    scanf("%d%d", &N, &K);
    for (int i = 1; i <= N; ++i) {
        scanf("%d", &x[i]);
        SP[i] = SP[i - 1] + x[i];
    }

    int res = DP(1);
    for (int i = 1; i <= N; ++i)
        dp[1][i] = max(dp[1][i - 1], SP[i]);
    DP(2);
    for (int i = 1; i <= N; ++i)
        chmax(res, dp[K][i] + SP[N] - SP[i]);
    printf("%d", res);

    return 0;
}