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