Cod sursa(job #24214)

Utilizator t30Rosu Teodor t30 Data 1 martie 2007 21:50:04
Problema Ferma Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#define MAX 1000000000
int n,K;
long s1,s2,x[10010],a[10100][2],b[10100][2];

void READ()
{   int i;
    FILE *f;
    f=fopen("ferma.in","r");
    fscanf(f,"%d %d",&n,&K);
    s1=s2=0;
    for(i=1;i<=n;i++){
	fscanf(f,"%d",&x[i]);
	s1+=x[i];
	s2=s1;
    }
    fclose(f);
}

long min(long x,long y)
{
  if(x<y) return x;
  else return y;
}

long SOLVE(int w)
{ int k,i,j;
  long m=0;

  for(i=0;i<=n;i++)
    b[i][0]=0;

  if(w==0) a[1][0]=MAX,a[1][1]=MAX,b[1][0]=0,b[1][1]=MAX;
  else a[1][0]=MAX,a[1][1]=x[1],b[1][1]=MAX,b[1][0]=MAX;
  K=K+w;

  for(j=1;j<=K;j++){
		for(i=0;i<=n;i++)
		       a[i][0]=a[i][1]=MAX;

		if(w==1 && j==1) a[1][1]=x[1];

		for(i=2;i<=n;i++){
			a[i][0]=min(a[i-1][0],a[i-1][1]);
			a[i][1]=min( b[i-1][0]+x[i], a[i-1][1]+x[i]);
		}
       
	
         
        if(m>a[n][0]) m=a[n][0];
        if(m>a[n][1] && !(w==1 && j==K-1)) m=a[n][1]; 
         
		for(i=0;i<=n;i++){
			b[i][0]=a[i][0];
			b[i][1]=a[i][1];
		}
  }
return m;
}

void PRINT()
{
   FILE *g;
   g=fopen("ferma.out","w");

   s1=s1-SOLVE(0);
   s2=s2-SOLVE(1);
   fprintf(g,"%ld\n",(s1>s2?s1:s2));


   fclose(g);
}

int main()
{
READ();
PRINT();
return 0;
}