Cod sursa(job #182556)
#include <stdio.h>
#define NM 10001
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define INF 2000000000
int n, m, v[NM];
int a[2][NM], b[2][NM];
int i, j, k, l1, l2;
int main()
{
freopen("ferma.in", "r", stdin);
freopen("ferma.out", "w", stdout);
scanf("%d %d", &n, &m);
for ( i = 1; i <= n; i++ ) scanf("%d", &v[i]);
a[0][0] = b[0][0] = 0;
l1 = 0, l2 = 1;
for ( k = 1; k <= m+1; k++, l1 = !l1, l2 = !l2 )
{
//for ( i = 0; i < k; i++ )
// a[l2][i] = b[l2][i] = -INF;
a[l2][0] = b[l2][0] = -INF;
for ( i = k; i <= n; i++ )
b[l2][i] = Max(b[l2][i-1], a[l2][i-1]),
a[l2][i] = Max(a[l2][i-1], Max(b[l1][i-1], a[l1][i-1])) + v[i];
}
printf("%d\n", Max(Max(a[l2][n], b[l2][n]), 0));
return 0;
}