Pagini recente » Cod sursa (job #2633960) | Cod sursa (job #948686) | Cod sursa (job #2424648) | Cod sursa (job #3267184) | Cod sursa (job #2551624)
#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;
}