Cod sursa(job #2553708)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 22 februarie 2020 11:16:08
Problema Ferma Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define Nmax 10005
#define zeros(x) ((x^(x-1))&x)
 
using namespace std;
/*
ifstream f("stramosi.in");
ofstream g("stramosi.out");
*/
 
ifstream f("ferma.in");
ofstream g("ferma.out");
 
int n, k;
int v[Nmax];
 
int dp1[2][Nmax]; //dp1[i][j] = daca iau i subsecvente si ultima se termina pe pozitia j
int dp2[2][Nmax]; //dp2[i][j] = daca iau i subsecvente si ultima se termina pe o pozitie <= j
 
int main()
{
    f >> n >> k;
 
    for (int i = 1; i <= n; i++)
        f >> v[i];
 
    bool h = 1;
    for (int i = 1; i <= k; i++, h^=1)
    {
        for (int j = 1; j <= n; j++)
        {
            if (j >= 2)
                dp1[h][j] = v[j] + max(dp1[h][j-1], dp2[h^1][j-2]);
            else
                dp1[h][j] = v[j] + dp1[h][j-1];
 
            dp2[h][j] = max(dp2[h][j-1], dp1[h][j]);
        }
    }
 
    int ans = dp2[h ^ 1][n];
 
    memset(dp1, 0, sizeof(dp1));
    memset(dp2, 0, sizeof(dp2));
 
    h = 1;
    for (int j = 1; j <= n; j++)
    {
        dp1[h][j] = v[j] + dp1[h][j-1];
        dp2[h][j] = max(dp2[h][j-1], dp1[h][j]);
    }
 
    h = 0;
    for (int i = 2; i <= k; i++, h ^= 1)
    {
        for (int j = 1; j <= n; j++)
        {
            dp1[h][j] = v[j] + max(dp1[h][j-1], dp2[h^1][j-2]);
            dp2[h][j] = max(dp2[h][j-1], dp1[h][j]);
        }
    }
 
    int sum = 0;
    for (int i = n; i > 1; i--)
    {
        sum+=v[i];
        ans = max(ans, dp2[h^1][i-1] + sum);
    }
 
    g << ans << '\n';
    return 0;
}