Cod sursa(job #526796)

Utilizator AndreyPAndrei Poenaru AndreyP Data 29 ianuarie 2011 14:39:55
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cassert>
#define N 10010
#define K 1010
template< class T >
inline T maxim(T x,T y) {
	return ( (x>y) ? x : y );
}
template< class T >
inline T minim(T x,T y) {
	return ( (x<y) ? x : y );
}

int n,k;
int v[N],s[N];
int a[2][K];
int rez = 0;

inline void citire() {
	scanf("%d%d",&n,&k);
	assert(k<=n);

        for(int i=1; i<=n; ++i)
		scanf("%d",&v[i]);

	s[n] = v[n];
	for(int i=n-1; i>0; --i)
		s[i] = s[i+1] + v[i];
}

inline void rezolva() {
	a[0][1] = maxim(0,v[1]);
	a[1][1] = v[1];

	for(int i=2; i<=n; ++i) {
		if(i<=k) {
			a[0][i] = a[1][i-1]+v[i];
			a[1][i] = a[0][i];
		}	
        	for(int j=minim(i-1,k); j>0; --j) {
			a[1][j] = maxim(a[1][j]+v[i],a[0][j-1]+v[i]);
			a[0][j] = maxim(a[0][j],a[1][j]);
		}
	}

	rez = maxim(rez,a[0][k]);


	a[0][1] = a[1][1] = v[1];

	for(int i=2; i<n; ++i) {
		if(i<=k) {
			a[0][i] = a[1][i-1]+v[i];
			a[1][i] = a[0][i];
		}
		for(int j=minim(i-1,k); j>1; --j) {
			a[1][j] = maxim(a[1][j]+v[i],a[0][j-1]+v[i]);
			a[0][j] = maxim(a[0][j],a[1][j]);
		}
		a[1][1] = a[1][1]+v[i];
		a[0][1] = maxim(a[0][1],a[1][1]);

		if(i>=k && a[0][k]+s[i+1]>rez)
			rez = a[0][k]+s[i+1];
	}
}

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

        citire();
	rezolva();

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

	return 0;
}