Cod sursa(job #705210)

Utilizator asaidaAnca Vamanu asaida Data 3 martie 2012 18:29:31
Problema Subsecventa de suma maxima Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

/*
 * Se dă un şir S[] = (s1, s2, .., sN) de lungime N.
 * O subsecvenţă a şirului este de forma: (si, si+1, ..., sj) cu 1 ≤ i ≤ j ≤ N, iar suma subsecvenţei este si + si+1 + ... + sj.
 * Se cere să se determine subsecvenţa de sumă maximă.
 */
/*
 * Out: smax indice_inceput indice_sf
 */

/*  Relatia de recurenta:
 *  sum[i] = (v[i] + sum[i-1]>0)?(v[i] + sum[i-1]):v[i]
 *  len[i] = (v[i] + sum[i-1]>0) ? ( 1 + len[i-1] ): 1
 * */


#define NMAX 6000002
int N;
int v[NMAX];
int smax =INT_MIN;
int bi, blen;

void solutie_ssm()
{
	int i;
	int sum, len;

	sum = v[1];
	len = 1;

	for( i = 2; i <= N; i++ ) {
		if(sum >= 0 && sum + v[i] > 0) {
			sum = sum + v[i];
			len = len + 1;
		} else {
			sum = v[i];
			len = 1;
		}
		if( smax < sum ) {
			smax = sum;
			bi = i;
			blen = len;
		}
	}
}

int main()
{
	FILE *f, *fout;
	int i;

	f = fopen("ssm.in", "r");

	fscanf(f, "%d", &N);
	for(i  = 1 ; i <= N; i++ ) {
		fscanf(f, "%d", &v[i]);
	}
	fclose(f);

	solutie_ssm();

	fout = fopen("ssm.out", "w");
	fprintf(fout, "%d %d %d\n", smax, bi - blen+1, bi);

	fclose(fout);
	return 0;
}