Cod sursa(job #3211004)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 7 martie 2024 22:32:58
Problema Ferma Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>
///oтключаю телефон

using namespace std;

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

const int NMAX=1e4+5;
const int KMAX=1e3+5;

int dp[KMAX][NMAX];
int sp[NMAX];
int v[NMAX];

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,k,i,j,maxi=0;
    fin>>n>>k;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        sp[i]=sp[i-1]+v[i];
    }
    for(i=1;i<=k;i++)
    {
        int best=dp[i-1][i-1]-sp[i-1];
        for(j=i;j<=n;j++)
        {
            dp[i][j]=max(dp[i][j-1],sp[j]+best);
            best=max(best,dp[i-1][j]-sp[j]);
        }
    }
    maxi=max(0,dp[k][n]);
    for(i=1;i<=n;i++)
        dp[1][i]=max(dp[1][i-1],sp[i]);
    for(i=2;i<=k;i++)
    {
        int best=dp[i-1][i-1]-sp[i-1];
        for(j=i;j<=n;j++)
        {
            dp[i][j]=max(dp[i][j-1],sp[j]+best);
            best=max(best,dp[i-1][j]-sp[j]);
        }
    }
    for(i=k;i<=n;i++)
        maxi=max(maxi,dp[k][i]+sp[n]-sp[i]);
    fout<<maxi;
    fin.close();
    fout.close();
    return 0;
}