Cod sursa(job #531560)

Utilizator Robert29FMI Tilica Robert Robert29 Data 9 februarie 2011 21:17:10
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
FILE*f=fopen("ferma.in","r");
FILE*g=fopen("ferma.out","w");
int max(int a,int b){
	if(a>b)
		return a;
	else
		return b;
}
int min(int a,int b){
	if(a<b)
		return a;
	else
		return b;
}
int n,k,a1[1002],max1,v[10001];
int b1[1002],a2[1002],b2[1002];
int main(){
	fscanf(f,"%d%d",&n,&k);
	for(int i=1;i<=n;++i)
		fscanf(f,"%d",&v[i]);
	//a[1][1]=v[1];
	for(int j=1;j<k;j++)
		a1[j]=b1[j]=b2[j]=a2[j]=-1000000000;
	for(int i=1;i<=n;i++){
		int x=min(i,k);
		for(int j=1;j<=k;j++){
			a2[j]=max(a1[j]+v[i],b1[j-1]+v[i]);
			a2[j]=max(a2[j],a1[j-1]+v[i]);
			b2[j]=max(a1[j],b1[j]);
		}
		for(int j=1;j<=k;j++){
			a1[j]=a2[j];
			b1[j]=b2[j];
		}
	}
	max1=max(a1[k],b1[k]);
	k++;
	
	for(int j=1;j<k;j++)
		a1[j]=b1[j]=b2[j]=a2[j]=-1000000000;
	
	a1[1]=a1[2]=v[1]+v[2];
	b1[0]=0;
	b1[1]=v[1];
	
	for(int i=3;i<=n;i++){
		int x=min(i,k);
		for(int j=1;j<=k;j++){
			a2[j]=max(a1[j]+v[i],b1[j-1]+v[i]);
			a2[j]=max(a2[j],a1[j-1]+v[i]);
			b2[j]=max(a1[j],b1[j]);
		}
		for(int j=1;j<=k;j++){
			a1[j]=a2[j];
			b1[j]=b2[j];
		}
	}
	max1=max(max1,a1[k]);
	max1=max(max1,0);
	fprintf(g,"%d",max1);
	
	fclose(g);
	fclose(f);
	return 0;
}