Cod sursa(job #2710605)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 22 februarie 2021 19:32:56
Problema Ferma Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ferma.in");
ofstream fout("ferma.out");

const int nmax = 10005, inf = 2000000000, kmax = 1005;
int n, k, v[nmax], dp[nmax][kmax][2], dp2[nmax][kmax][2];


int main(){
    fin >> n >> k;
    for (int i = 1; i <= n; ++i){
        fin >> v[i];
        dp2[i][0][0] = dp2[i][0][1] = -inf;
    }
    for (int i = 1; i <= k; ++i){
        dp[n + 1][i][0] = dp[n + 1][i][1] = -inf;
        dp2[n + 1][i][0] = -inf;
    }
    for (int index = n; index >= 1; --index){
        for (int cnt = 1; cnt <= k; ++cnt){
            for (int p = 0; p <= 1; ++p){
                if (p){
                    dp[index][cnt][p] = max(dp[index][cnt - 1][0], v[index] + dp[index + 1][cnt][1]);
                    dp2[index][cnt][p] = max(dp2[index][cnt - 1][0], v[index] + dp2[index + 1][cnt][1]);
                }
                else{
                    dp[index][cnt][p] = max(dp[index + 1][cnt][p], v[index] + dp[index + 1][cnt][1]);
                    dp2[index][cnt][p] = max(dp2[index + 1][cnt][p], v[index] + dp2[index + 1][cnt][1]);
                }
            }
        }
    }
    int maxim = dp[1][k][0];
    int sum = 0;
    for (int i = 1; i < n - k; ++i){
        sum += v[i];
        maxim = max(maxim, sum + dp2[i + 1][k][0]);
    }
    if (maxim < 0){
        maxim = -1;
    }
    fout << maxim;
    return 0;
}