top of page

Subsecvență de sumă maximă

Cerință:

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. Se cere să se determine subsecvenţa de sumă maximă.

​

Rezolvare:

SoluÈ›ia optimă foloseÈ™te metoda programării dinamice. Construim un ÅŸir besti egal cu costul subsecvenÅ£ei de sumă maximă ce se termină pe poziÅ£ia i. Rezultă recurenÅ£a următoare: besti = Max(besti-1 + si, si). Rezultă mai departe că si este sfârÅŸitul unei subsecvenÅ£e ce se extinde spre stânga cu subsecvenÅ£a de sumă maximă ce se termină în si-1 doar dacă această subsecvenţă are suma pozitivă. ÃŽn implementare nu este necesar să reÅ£inem întregul vector best si nici È™irul S, ci doar o variabilă, rezolvarea facându-se direct din citire, după cum se vede ÅŸi în sursă.  Complexitate: O(N) timp È™i O(1) memorie.


#include <iostream>

using namespace std;


int main() {

    int n, i, st, dr, maxx = -(1 << 29), sum = 0, poz = 1, x;

    cin >> n;

    for (i = 1; i <= n; i++) {

        cin >> x;

        if(sum < 0) {

            sum = x;

            poz = i;

        } else {

            sum += x;

        }


        if(sum > maxx) {

            maxx = sum;

            st = poz; 

           dr = i;

        }

    }

    cout << maxx << " " << st << " " << dr << "\n";

    return 0;

}

Subsecvență de sumă maximă: Projects
bottom of page