Sia data una sequenza di interi
(nell'esempio,
), memorizzata come un array
(per semplicità, almeno un intero è
positivo). Un segmento
denota una porzione di
elementi contigui in
, dalla posizione
fino alla posizione
(inclusa). La somma di un segmento
è
data dalla somma dei suoi componenti:
. Il problema
consiste nell'individuare un segmento di somma massima, dove a
parità di somma viene scelto il segmento più corto possibile.
Nell'esempio,
fornisce somma massima, di
valore 11. Osservare che il segmento di somma massima non
necessariamente contiene il massimo elemento.
max <- (-infinito) // un intero sufficientemente piccolo for i <- 1 to n do for j <- i to n do // esamina il segmento S[i...j] somma <- 0; for k <- i to j do somma <- somma + S[k] // ora somma = somma(S[i...j]) if somma > max then max <- somma // volendo, si possono memorizzare anche i e j
Costo:
.
Svantaggio: non si utilizza
per il calcolo di
.
max <- (-infinito) // un intero sufficientemente piccolo for i <- 1 to n do somma <- 0; for j <- i to n do // esamina il segmento S[i...j] somma <- somma + S[j] // ora somma = somma(S[i...j]) if somma > max then max <- somma // volendo, si possono memorizzare anche i e j
Costo:
.
Svantaggio: non si sfrutta pienamente la struttura del problema.
somma
diventa negativa o
nulla, si può considerare un nuovo segmento disgiunto da quelli
considerati precedentemente:
max <- (-infinito) // un intero sufficientemente piccolo somma <- (-infinito) for j <- 1 to n do if somma <= 0 then i <- j, somma <- S[j] // caso (b) else somma <- somma + S[j] // caso (a) // ora somma = somma(S[i...j]) if somma > max then max = somma // volendo, si possono memorizzare anche i e jCosto: