Pagini recente » Cod sursa (job #1765945) | Cod sursa (job #2124114) | Cod sursa (job #67053) | Cod sursa (job #1039680) | Cod sursa (job #974533)
Cod sursa(job #974533)
/*
Subsecventa de suma maxima
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.
Cerinţă
Se cere să se determine subsecvenţa de sumă maximă.
Date de intrare
Fişierul de intrare ssm.in conţine pe prima linie un număr natural N, reprezentând lungimea şirului. Următoarea linie conţine N numere întregi separate printr-un spaţiu, reprezentând în ordine elementele şirului.
Date de ieşire
În fişierul de ieşire ssm.out se vor tipări trei numere în această ordine: suma subsecvenţei de sumă maximă, indicele de început şi indicele de sfârşit.
*/
#include <iostream>
using namespace std;
const int LMAX = 7000005;
cont int SMIN = -2147483648;
int n,arr[LMAX], start, finish;
int MaxSum(int arr[], int n, int &start, int &finish)
{
int sum=0;
int maxSum=SMIN;
int local_start=1;
finish=-1;
for (int i=1; i<=n; i++)
{
sum+=arr[i];
if (sum <0)
{
sum=0;
local_start=i+1;
}
if (sum > maxSum)
{
maxSum=sum;
start=local_start;
finish=i;
}
}
if (finish != -1 )
return maxSum;
return -1;
}
int main()
{
freopen("ssm.in","r",stdin);
freopen("ssm.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
cin>>arr[i];
cout<<MaxSum(arr,n,start,finish)<<" ";
cout<<start<<" "<<finish;
return 0;
}