Cod sursa(job #3245996)

Utilizator vralexRadu Vasilescu vralex Data 1 octombrie 2024 13:42:44
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#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;
}