Pagini recente » Cod sursa (job #541115) | Cod sursa (job #2875687) | Cod sursa (job #267195) | Cod sursa (job #41363) | Cod sursa (job #2566315)
/// fie v cu n elemente vectorul dat
/// s[i] = suma maxima a unei secvente terminate chiar cu elementul de pe pozitia i
/// la calculul lui s[i] vom folosi deci obligatoriu elementul de pe pozitia i
/// avem doua variante: lipim elementul de pe pozitia i la cea mai buna suma
/// ce se poate obtine pana la pozitia anterioara, si atunci am avea s[i] = s[i-1]+v[i]
/// sau incepem cu el o secventa noua, asadar s[i] = maxim(v[i], v[i]+s[i-1])
/// Observam ca un element din s se calculeaza doar din anteriorul si atunci, in loc
/// sa tinem un vector, tinem o singura variabila s care e odata optimul de la pozitia anterioara
/// si apoi se actualizeaza pentru pozitia curenta.
#include<fstream>
using namespace std;
int n, x, maxim, i, s, pmax, umax, p;
int main()
{
ifstream fin("ssm.in");
ofstream fout("ssm.out");
fin>>n;
maxim = -2000000000;
p = 1;
for (i=1;i<=n;i++) {
fin>>x;
if (x + s >= x) {
s = x + s;
}else {
s = x;
p = i;
}
if (s > maxim) {
maxim = s;
pmax = p;
umax = i;
}
}
fout<<maxim<<" "<<pmax<<" "<<umax;
return 0;
}