Cod sursa(job #727544)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 28 martie 2012 07:54:07
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>

#define maxn 100005
#define INF (1<<29)

FILE*f=fopen("ferma.in","r");
FILE*g=fopen("ferma.out","w");

int n,k,sol;
int S[maxn],D1[maxn],D2[maxn];

inline int max ( const int &a , const int &b ){
	return a >= b ? a : b;
}

inline void dinamica1 () {
	
	int B; D2[0] = -INF;
	for ( int j = 1 ; j <= k ; ++j ){
		if ( j == 1 )	B = 0;
		else	B = -INF;
		for ( int i = 1 ; i <= n ; ++i ){
			D2[i] = max(D2[i-1],B+S[i]);
			B = max(B,D1[i]-S[i]);
		}
		
		for ( int i = 1 ; i <= n ; ++i ){
			D1[i] = D2[i]; D2[i] = 0;
		}
	}
	
	for ( int i = 1 ; i <= n ; ++i ){
		sol = max(sol,D1[i]);
	}
}

inline void dinamica2 () {
	
	int B; D2[0] = -INF;
	
	for ( int i = 1 ; i <= n ; ++i ){
		D1[i] = max(D1[i-1],S[i]);
	}
	
	for ( int j = 2 ; j <= k ; ++j ){
		B = -INF;
		for ( int i = 1 ; i <= n ; ++i ){
			D2[i] = max(D2[i-1],B+S[i]);
			B = max(B,D1[i]-S[i]);
		}
		
		for ( int i = 1 ; i <= n ; ++i ){
			D1[i] = D2[i]; D2[i] = 0;
		}
	}
	
	for ( int i = 1 ; i < n ; ++i ){
		sol = max(sol,D1[i]+S[n]-S[i]);
	}
}

int main () {
	
	fscanf(f,"%d %d",&n,&k);
	int x;
	for ( int i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d",&x);
		S[i] = S[i-1] + x;
	}
	
	dinamica1();
	dinamica2();
	
	fprintf(g,"%d\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}