Cod sursa(job #1463114)

Utilizator piroComisia piro Data 20 iulie 2015 03:52:48
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int kNMax = 10010;
const int kKMax = 1010;

int n, k;
int x[kNMax];
int dp[kKMax][kNMax], best[kKMax][kNMax], bestSuffix[kNMax];

void init() {
    for (int i = 1; i <= n; ++i)
        dp[1][i] = x[i] + max(dp[1][i - 1], 0);
}

void init2() {
    for (int i = 1; i <= n; ++i)
        dp[1][i] = x[i] + dp[1][i - 1];
    int sum = 0;
    for (int i = n; i >= 1; --i) {
        sum += x[i];
        bestSuffix[i] = max(sum, bestSuffix[i + 1]);
    }
}

void solve() {
    best[1][1] = dp[1][1];
    for (int i = 2; i <= n; ++i)
        best[1][i] = max(best[1][i - 1], dp[1][i]);

    for (int i = 2; i <= k; ++i) {
        for (int j = 1; j < i; ++j)
            best[i][j] = dp[i][j] = -1000000;
        for (int j = i; j <= n; ++j) {
            dp[i][j] = x[j] + max(dp[i][j - 1], best[i - 1][j - 1]);
            best[i][j] = max(dp[i][j], best[i][j - 1]);
        }
    }
}

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]);

    init();
    solve();
    int res = best[k][n];
    init2();
    solve();
    for (int i = 1; i <= n; ++i)
        if (best[k][i] + bestSuffix[i + 1] > res)
            res = best[k][i] + bestSuffix[i + 1];
    printf("%d", res);
    return 0;
}