Cod sursa(job #820610)

Utilizator enedumitruene dumitru enedumitru Data 21 noiembrie 2012 08:07:21
Problema Subsecventa de suma maxima Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
/*
	Prima rezolvare care ne vine ?n minte are complexitatea O(N3) si consta ?n determinarea sumei fiecarei subsecvente 
	posibile si retinerea maximului acestor sume. Este evident ca anumite sume partiale sunt calculate de mai multe ori.
	
	Putem reduce complexitatea la O(N2) tin?nd cont de faptul ca suma subsecventei a[j..i] este egala cu suma subsecventei 
	a[j..i-1], la care se aduna a[i]. Pastram ?ntr-un sir sp[i] suma elementelor din subsecventa a[1..i].
	Pentru a determina suma elementelor din subsecventa a[j..i] facem diferenta: sp[i] - sp[j-1].

	Ideea poate fi rafinata calcul?nd pentru fiecare indice i numarul b[i], reprezent?nd subsecventa de suma maxima
	cu capatul drept ?n i. Este usor de observat ca b[i] = max(sp[i] - sp[j-1]), unde j ia valori de la 1 la i.
	Relatia anterioara se mai poate scrie: b[i] = sp[i] - min(sp[j-1]). 
	Obtinem astfel un algoritm liniar care ne determina subsecventa de suma maxima ceruta.
*/
#include<fstream>
#define Nmax 6000005
using namespace std;
ifstream f("ssm.in"); ofstream g("ssm.out");
long long inf;
int N,k,st,dr,minim,Smax,a,sp[Nmax],b[Nmax];
int main()
{	inf=1000000000; inf=-inf*inf;
	f>>N;
	for (int i = 1; i <= N; i++) f>>a,sp[i] = a + sp[i-1];
	minim = sp[0]; k=1;
	Smax = -inf;
	for (int i = 1; i <= N; i++) 
	{
		b[i] = sp[i] - minim;
		if (minim > sp[i]) {minim = sp[i]; k=i+1;}
		if (Smax < b[i]) {Smax = b[i]; st=k; dr=i;}
	}
	if(st>dr) st=dr;
	g<<Smax<<' '<<st<<' '<<dr<<'\n';
	return 0;
}