Cod sursa(job #631644)

Utilizator deiosxHalalai Tudor Andrei deiosx Data 9 noiembrie 2011 11:50:01
Problema Ferma Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>

using namespace std;

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

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

int N,K,nc,V[MaxN],S[MaxN],D[MaxK][MaxN];

int main()
{
	fin>>N>>K;
	for(register int i=1;i<=N;++i)
	{
		fin>>V[i];
		S[i]=S[i-1]+V[i];
	}
	fin.close();
	
	for(register int i=1;i<=K;++i)
	{
		int best=0;
		for(register int j=1;j<=N;++j)
		{
			D[i][j]=max(D[i][j-1],best+S[j]);
			best=max(best,D[i-1][j]-S[j]);
		}
	}

	nc=D[K][N];

	for(register int j=1;j<=N;++j)
	{
		D[1][j]=max(D[1][j-1],S[j]);
	}

	for(register int i=2;i<=K;++i)
	{
		int best=0;
		D[i][1]=S[1];
		for(register int j=2;j<=N;++j)
		{
			D[i][j]=max(D[i][j-1],best+S[j]);
			best=max(best,D[i-1][j]-S[j]);
		}
	}

	int best=0;
	for(register int j=1;j<N;++j)
	{
		best=max(best,D[K][j]-S[j]);
	}

	fout<<max(nc,best+S[N]);
	fout.close();
	return 0;
}