Pagini recente » Cod sursa (job #759562) | Cod sursa (job #1541708) | Cod sursa (job #3123898) | Cod sursa (job #2115298) | Cod sursa (job #1815498)
#include <iostream>
#include <fstream>
#define Nmax 6000005
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
/// foloseşte următoarea idee: notând cu Si suma tuturor valorile din şir de pe poziţiile 1 .. i atunci suma maximă a unei subsecvenţe ce se
///termină pe poziţia i este Max(Si - Sj), j < i care este echivalentă cu Si - Min(Sj), j < i. Rezultă că va trebui doar să reţinem minimul dintre toate sumele parţiale Sj cu j < i.
int n,a[Nmax];// in a se retin sumele partiale de la 1 pana l i
void Citire ()
{int x;
fin>>n;
for(int i=1;i<=n;i++)
{fin>>x;
a[i]=a[i-1]+x;}
}
void Calculare_Ssm()
{
int i,minim=0,xbun,ybun,xmin,summax=-9999999,maxi;
minim=a[1];
xbun=ybun=1;
xmin=1;
for (i=2;i<=n;i++)
{ maxi=a[i]-minim;// suma maxima ce se poate obtine din intervalul 1,i este S[i]-min(s[j]),j<=i
if (maxi>summax) {summax=maxi;xbun=xmin+1;ybun=i;}
if (a[i]<minim){xmin=i;minim=a[i];}
}
fout<<summax<<" "<<xbun<<" "<<ybun;
}
int main()
{
Citire();
Calculare_Ssm();
return 0;
}