Cod sursa(job #2551624)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 20 februarie 2020 00:18:20
Problema Ferma Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 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;
}