Cod sursa(job #478749)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 20 august 2010 11:23:28
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>
#define Nmax 10002
#define Kmax 1002
#define INF 2147000000

int A[2][Kmax],B[2][Kmax];
int V[Nmax];
int n,k,cu_start,rez,st;

inline int Minim(int x,int y){ return x<y ? x:y; }
inline int Maxim(int x,int y){ return x>y ? x:y; }

void work(){
	int i,j,q;
	st=0; k+=cu_start; 
	A[0][1]=V[1]; B[0][1]=-INF; A[0][2]=B[0][2]=-INF;
	A[0][0]=-INF;
	
	for(i=2;i<=n;++i){
		q=Minim(i,k);
		A[st^1][q+1]=B[st^1][q+1]=-INF;
		A[st^1][0]=-INF;
		
		if( cu_start==1 ) B[st^1][0]=-INF;
			
		for(j=1;j<=q;++j){
			A[st^1][j]=Maxim(A[st][j],B[st^1][j-1]) + V[i];
			B[st^1][j]=Maxim(A[st][j],B[st][j]);
		}
		st^=1;
	}
}

int main(){
	int i;
	freopen("ferma.in","r",stdin);
	freopen("ferma.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(i=1;i<=n;++i) scanf("%d",&V[i]);
	cu_start=0; 
	work();
	rez=Maxim(A[st][k],B[st][k]);
	cu_start=1;
	work();
	rez=Maxim(rez,A[st][k]);
	
	printf("%d\n",rez>0 ? rez:0);
	fclose(stdin); fclose(stdout);
	return 0;
}