Pagini recente » Cod sursa (job #1173377) | Cod sursa (job #2182435) | Cod sursa (job #1162461) | Cod sursa (job #848300) | Cod sursa (job #705200)
Cod sursa(job #705200)
#include <stdio.h>
#include <stdlib.h>
#include <string.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 = 0, bi, blen;
void solutie_ssm()
{
int i;
int sum, len;
sum = v[1];
len = 1;
for( i = 2; i <= N; i++ ) {
if(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;
}