Cod sursa(job #530854)

Utilizator cnt_tstcont teste cnt_tst Data 8 februarie 2011 16:04:47
Problema Ferma Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <cstring>

using namespace std;

const char InFile[]="ferma.in";
const char OutFile[]="ferma.out";
const int MaxN=10111;
const int MaxK=1024;
const int INF=127;

ifstream fin(InFile);
ofstream fout(OutFile);

int V[MaxN],N,K,Abuffer1[MaxN],Abuffer2[MaxN],Bbuffer1[MaxN],Bbuffer2[MaxN];
int *Aline1=Abuffer1,*Aline2=Abuffer2;
int *Bline1=Bbuffer1,*Bline2=Bbuffer2;

int main()
{
	fin>>N>>K;
	for(register int i=1;i<=N;++i)
	{
		fin>>V[i];
	}
	fin.close();
	
	memset(Abuffer1,-INF,sizeof(Abuffer1));
	memset(Abuffer2,-INF,sizeof(Abuffer2));
	memset(Bbuffer1,-INF,sizeof(Bbuffer1));
	memset(Bbuffer2,-INF,sizeof(Bbuffer2));
	
	Aline1[1]=V[1];
	for(register int i=2;i<=N;++i)
	{
		for(register int j=1;j<=K;++j)
		{
			Aline2[j]=max(Aline1[j]+V[i],Bline1[j-1]+V[i]);
			Aline2[j]=max(Aline2[j],Aline1[j-1]+V[i]);
			Bline2[j]=max(Aline1[j],Bline1[j]);
		}
		swap(Aline1,Aline2);
		swap(Bline1,Bline2);
		memset(Aline2,-INF,sizeof(Abuffer2));
		memset(Bline2,-INF,sizeof(Abuffer2));
	}
	int sol=max(Aline1[K],Bline1[K]);
	
	/*memset(Abuffer1,0,sizeof(Abuffer1));
	memset(Abuffer2,0,sizeof(Abuffer2));
	memset(Bbuffer1,0,sizeof(Bbuffer1));
	memset(Bbuffer2,0,sizeof(Bbuffer2));
	*/
	memset(Abuffer1,-INF,sizeof(Abuffer1));
	memset(Abuffer2,-INF,sizeof(Abuffer2));
	memset(Bbuffer1,-INF,sizeof(Bbuffer1));
	memset(Bbuffer2,-INF,sizeof(Bbuffer2));
	
	Aline1[1]=V[1]+V[2];
	Aline1[2]=V[1]+V[2];
	Bline1[1]=V[1];
	for(register int i=3;i<=N;++i)
	{
		for(register int j=1;j<=K+1;++j)
		{
			Aline2[j]=max(Aline1[j]+V[i],Bline1[j-1]+V[i]);
			Aline2[j]=max(Aline2[j],Aline1[j-1]+V[i]);
			Bline2[j]=max(Aline1[j],Bline1[j]);
			
		}
		swap(Aline1,Aline2);
		swap(Bline1,Bline2);
		memset(Aline2,-INF,sizeof(Abuffer2));
		memset(Bline2,-INF,sizeof(Abuffer2));
		
	}
	sol=max(sol,Aline1[K+1]);

	sol=max(0,sol);
	fout<<sol;
	fout.close();
	return 0;
}