Pagini recente » Cod sursa (job #1114901) | Cod sursa (job #2496099) | Cod sursa (job #1847060) | Cod sursa (job #3288055) | Cod sursa (job #96262)
Cod sursa(job #96262)
#include <cstdio>
#include <fstream>
using namespace std;
#define FIN "ferma.in"
#define FOUT "ferma.out"
#define MAX_N 10005
#define MAX_K 1005
int L1[MAX_N];
int L2[MAX_N]; // liniile din dinmica
int D[MAX_N]; // deque
int A[MAX_N];
int S[MAX_N];
int N, K, i;
int BEST; //solutia
int li, lf; // indici deque
inline int MAX (int a, int b) { if (a > b) return a; else return b; }
void init ()
{
int i, Sc, M;
for (i = 1; i <= N; ++i) S[i] = S[i - 1] + A[i];
L1[1] = Sc = M = A[1];
for (i = 2; i <= N; ++i)
{
if (Sc < 0) Sc = A[i];
else Sc += A[i];
if (Sc > M) M = Sc;
L1[i] = M;
}
}
void solve (void)
{
int i, j;
init ();
// for (i = 1; i <= N; ++i)
// printf ("%d ", L1[i]);
for (i = 2; i <= K; ++i)
{
int Mx = L1[1] - S[1];
for (j = 2; j <= N; ++j)
{
L2[j] = MAX (L2[j - 1], Mx + S[j]);
if (L1[j] - S[j] > Mx) Mx = L1[j] - S[j];
}
memcpy (L1, L2, sizeof (L2));
}
BEST = L2[N];
memset (L2, 0, sizeof (L2));
memcpy (L1, S, sizeof (S));
for (i = 2; i <= K; ++i)
{
int Mx = L1[1] - S[1];
for (j = 2; j <= N; ++j)
{
L2[j] = MAX (L2[j - 1], Mx + S[j]);
if (L1[j] - S[j] > Mx) Mx = L1[j] - S[j];
}
memcpy (L1, L2, sizeof (L2));
}
for (i = 1; i <= N; ++i)
BEST = MAX (BEST, L2[i] + S[N] - S[i]);
printf ("%d\n", (int) (BEST));
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d",&N, &K);
for (i = 1; i <= N; ++i) scanf ("%d", A + i);
solve ();
return 0;
}