Cod sursa(job #914822)

Utilizator m3rikPaul Urziceanu m3rik Data 14 martie 2013 14:58:36
Problema Subsecventa de suma maxima Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
/*
 * ssm.cpp
 * Subsecventa de suma maxima
 *
 *  Created on: Mar 14, 2013
 *      Author: Paulichesh
 */

#include <iostream>
#include <fstream>

using namespace std;

int *v,n,*best,*last,*seq,st,dr=-1;

int maxLast(int n)
{
	if(n == 0)
	{
		return last[0]=v[0];
	}
	if(last[n] > 0) return last[n];
	int m1 = maxLast(n-1) + v[n] ;
	int m2 = v[n];
	if(m1 > m2)
	{
		last[n] = m1;
	}
	else
	{
		last[n] = m2;
	}
	return last[n];
}


int maxBest(int n)
{
	if(n == 0)
	{
		return best[0]=v[0];
	}
	if(best[n] > 0) return best[n];
	int m1 = maxBest(n-1);
	int m2 = maxLast(n);
	if(m1 > m2)
	{
		best[n] = m1;
	}
	else
	{
		best[n] = m2;
	}
	return best[n];
}
void recSol(int n)
{
	if(dr==-1 && best[n-1] > last[n])
		recSol(n-1);
	else
	{
		if(last[n-1] + v[n] >= v[n])
		{
			if(dr == -1)dr = n;
			recSol(n-1);
		}
		else
		{
			st = n;

		}
	}
}

int main()
{
	ifstream fin ("ssm.in");
	ofstream fout ("ssm.out");
	fin >> n;
	v = new int[n];
	best = new int[n];
	last = new int[n];
	seq = new int[n];

	for(int i=0; i<n; i++)
		best[i]=last[i]=0;


	for (int i = 0; i < n; i++) {
		fin >> v[i];
	}
	fout << maxBest(n-1)<< " ";
	recSol(n-1);
	fout << st + 1 << " " << dr + 1 << endl;
	/*cout << st << " " << dr << endl;


	for (int i = 0; i < n; i++) {
		cout << best[i] <<" ";
	}
	cout << endl;

	for (int i = 0; i < n; i++) {
		cout << last[i] <<" ";
	}
	cout << endl;
*/
	/*for (int i = 0; i < n; i++) {
		cout << seq[i] <<" ";
	}
	cout << endl;
*/
	fin.close();
	fout.close();

	return 0;
}