Cod sursa(job #81280)

Utilizator peanutzAndrei Homorodean peanutz Data 31 august 2007 23:02:58
Problema Ferma Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 100//05
#define KMAX 1005
#define INFI -(0x3f3f3f3f)

int p[NMAX];
int a[2][NMAX];
int d[NMAX], st, dr;
int s[NMAX];
int n, k;

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;
	int stare = 1;
	//int max = INFI;

	for(i = 1; i <= k; ++i, stare = 1-stare)
	{
		a[stare][1] = p[1];
		d[1] = 0;
		st = dr = 1;

		for(j = 2; j <= n; ++j)
		{
			a[stare][j] = MAX(a[stare][j-1], d[st] + s[j]);

     		while(st <= dr && d[dr] <= a[1-stare][j] - s[j])
				--dr;
			d[++dr] = a[1-stare][j] - s[j];
		}
	}
    return a[1-stare][n];
}

void permuta()
{
	int i;
	memmove(p+1, p, sizeof(p));
	p[1] = p[n+1];
        p[n+1] = 0;
	for(i = 1; i <= n; ++i)
		s[i] = s[i-1] + p[i];
}


int main()
{
	freopen("ferma.in", "r", stdin);
	freopen("ferma.out", "w", stdout);

	read();

	int i, max = INFI;
	
	for(i = 1; i <= n-1; ++i)
	{
		max = MAX(max, dinamic());
		permuta();
	}
        printf("%d\n", max);

	return 0;
}