Cod sursa(job #347151)

Utilizator Mishu91Andrei Misarca Mishu91 Data 11 septembrie 2009 11:19:10
Problema Ferma Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>

using namespace std;

#define MAX_N 10005
#define MAX_K 1005

ifstream fin ("ferma.in");
ofstream fout ("ferma.out");

int N, K, Sol;
int V[MAX_N], A[MAX_K][MAX_N], B[MAX_K][MAX_N];

void citire()
{
	fin >> N >> K;
	
	for(int i = 1; i <= N; ++i)
		fin >> V[i];
}

void non_circ()
{
	for(int i = 0; i <= N; ++i)
		for(int j = 0; j <= K; ++j)
			if(j > i)
				B[i][j] = A[i][j] = -0x3f3f3f3f;
	for(int i = 1; i <= N; ++i)
		for(int j = 1; j <= K; ++j)
			A[i][j] = max(A[i-1][j-1], max(A[i-1][j], B[i-1][j-1])) + V[i],
			B[i][j] = max(A[i-1][j], B[i-1][j]);

	Sol = max(A[N][K], B[N][K]);
}

void circ()
{
	for(int i = 0; i <= N; ++i)
		for(int j = 0; j <= K; ++j)
			if(j > i)
				B[i][j] = A[i][j] = -0x3f3f3f3f;
	A[1][1] = V[1];
	B[1][1] = V[1];
	++K;
	for(int i = 2; i <= N; ++i)
		for(int j = 2; j <= K; ++j)
			A[i][j] = max(A[i-1][j-1], max(A[i-1][j], B[i-1][j-1])) + V[i],
			B[i][j] = max(A[i-1][j], B[i-1][j]);
		
	Sol = max(Sol, A[N][K]);
	fout << Sol;
}

int main()
{
	citire();
	non_circ();
	circ();
}