Pagini recente » Cod sursa (job #2711411) | Cod sursa (job #300328) | Cod sursa (job #2762700) | Cod sursa (job #748753) | Cod sursa (job #3245996)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ssm.in");
ofstream fout("ssm.out");
/*
dp[i] = suma subsecventei de suma maxima care se termina pe pozitia
i in array.
v[i+1] sigur e continut in subsecventa cu suma dp[i+1].
Dupa cum dp[i] e mai mare sau mai mic decat 0:
dp[i+1] = max(dp[i] + v[i+1], v[i+1]), dupa cum adaugam sau nu
subsecventa de suma maxima care se termina in i lui v[i+1].
dp[0] = v[0] initializare.
dp[i+1] = curent, dp[i] = prec si nu mai avem nevoie de array-ul dp.
*/
int main() {
vector<int> v;
// Nu avem nevoie si de stop, stop fiind i-ul din for. Avem nevoie
// doar de start, start_max si stop_max.
int n, x, curent, prec, maxi, start = 0, start_max = 0, stop_max = 0;
fin >> n;
for (int i = 0; i < n; i++) {
fin >> x;
v.push_back(x);
}
prec = v[0];
maxi = prec;
for (int i = 1; i < n; i++) {
// prec < 0 echivalent cu v[i] > v[i] + prec:
if (prec < 0) start = i;
curent = max(v[i], v[i] + prec);
if (curent > maxi) {
maxi = curent;
start_max = start;
stop_max = i;
}
prec = curent;
}
fout << maxi << ' ' << start_max + 1 << ' ' << stop_max + 1;
return 0;
}