Cod sursa(job #81309)

Utilizator peanutzAndrei Homorodean peanutz Data 1 septembrie 2007 11:46:41
Problema Ferma Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>

#define NMAX 20//10005
#define KMAX 10//05

int a[KMAX][NMAX], b[KMAX][NMAX];
int n, k;
int p[NMAX];

int s[NMAX];

void read()
{
	int i;
	scanf("%d%d", &n, &k);
	for(i = 1; i <= n; ++i)
		scanf("%d", p+i), s[i] = s[i-1] + p[i];
}

#define MAX(a, b) ((a) > (b)) ? (a) : (b)

int dinamic()
{
	int i, j;

	for(i = 1; i <= k; ++i)
	{
		for(j = 1; j <= n; ++j)
		{
			a[i][j] = MAX(MAX(a[i][j-1], a[i-1][j-1]), b[i-1][j-1]);
			a[i][j] += p[j];


			b[i][j] = MAX(a[i][j]-p[j], b[i][j-1]);
		}
	}
	int max = -1000;

	for(j = 1; j <= n; ++j)
		max = MAX(max, MAX(b[k][j] + s[n] - s[j], a[k][j] + s[n] - s[j]));
        return max;
}

void print(int a[KMAX][NMAX])
{
 for(int i = 1; i <= k; ++i)
 {
  for(int j = 1; j <= n; ++j)
	  printf("%d ", a[i][j]);
  printf("\n");
 }
 printf("\n");
}
		
int main()
{
	freopen("ferma.in", "r", stdin);
	freopen("ferma.out", "w", stdout);

	read();

	printf("%d\n", dinamic());

    //print(a);
    //print(b);

	return 0;
}