Cod sursa(job #530889)

Utilizator ChallengeMurtaza Alexandru Challenge Data 8 februarie 2011 16:43:34
Problema Ferma Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <cstdio>

using namespace std;

const char InFile[]="ferma.in";
const char OutFile[]="ferma.out";
const int MaxN=10002;
const int MaxK=1003;
const int INF=0;

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

int N,K,A[MaxN][MaxK],B[MaxN][MaxK],V[MaxN],sol;

int main()
{
	fin>>N>>K;
	for(register int i=1;i<=N;++i)
	{
		fin>>V[i];
	}
	fin.close();

	for(register int i=0;i<=N;++i)
	{
		for(register int j=0;j<=K;++j)
		{
			A[i][j]=B[i][j]=-INF;
		}
	}

	A[1][1]=V[1];
	for(register int i=2;i<=N;++i)
	{
		int x=min(i,K);
		for(register int j=1;j<=x;++j)
		{
			A[i][j]=max(max(A[i-1][j],B[i-1][j-1]),A[i-1][j-1]);
			B[i][j]=max(A[i-1][j],B[i-1][j]);
			A[i][j]+=V[i];
		}
	}
	sol=max(sol,max(A[N][K],B[N][K]));

	++K;
	for(register int i=0;i<=N;++i)
	{
		for(register int j=0;j<=K;++j)
		{
			A[i][j]=B[i][j]=-INF;
		}
	}
	A[1][1]=V[1];
	A[2][1]=V[1]+V[2];
	A[2][2]=V[1]+V[2];
	B[2][1]=V[1];
	for(register int i=3;i<=N;++i)
	{
		int x=min(i,K);
		for(register int j=1;j<=x;++j)
		{
			A[i][j]=max(max(A[i-1][j],B[i-1][j-1]),A[i-1][j-1]);
			B[i][j]=max(A[i-1][j],B[i-1][j]);
			A[i][j]+=V[i];
		}
	}
	sol=max(sol,A[N][K]);

	fout<<sol;
	fout.close();
	return 0;
}