On considère un tableau non vide de nombre entiers, positifs ou négatifs, et on souhaite déterminer
la plus grande somme possible de ses éléments consécutifs.
Par exemple, dans le tableau [1, -2, 3, 10, -4, 7, 2, -5], la plus grande
somme est 18 obtenue en additionnant les éléments 3, 10, -4, 7, 2.
Pour cela, on va résoudre le problème par programmation dynamique. Si on note tab le
tableau considéré et i un indice dans ce tableau, on se ramène à un problème plus simple : déterminer la plus grande somme possible de ses éléments consécutifs se terminant à
l’indice i.
Si on connait la plus grande somme possible de ses éléments consécutifs se terminant à
l’indice i - 1, on peut déterminer la plus grande somme possible de ses éléments consécutifs
se terminant à l’indice i :
soit on obtient une plus grande somme en ajoutant tab[i] à cette somme précédente ;
soit on commence une nouvelle somme à partir de tab[i].
Remarque : les sommes considérées contiennent toujours au moins un terme.
def sommepy-undmax(tab):bksl-nl n = len(tab)bksl-nl sommespy-undmax = [0] py-str nbksl-nl sommespy-undmax[0] = tab[0]bksl-nl # on calcule la plus grande somme se terminant en ibksl-nl for i in range(1, n):bksl-nl if ... + ... > ...: bksl-nl sommespy-undmax[i] = ... bksl-nl else:bksl-nl sommespy-undmax[i] = ... bksl-nl # on en déduit la plus grande somme de celles-cibksl-nl maximum = 0bksl-nl for i in range(1, n):bksl-nl if ... > ...: bksl-nl maximum = ibksl-nlbksl-nl return sommespy-undmax[...]bksl-nlbksl-nl# Testsbksl-nlassert sommepy-undmax([1, 2, 3, 4, 5]) == 15bksl-nlassert sommepy-undmax([1, 2, -3, 4, 5]) == 9bksl-nlassert sommepy-undmax([1, 2, -2, 4, 5]) == 10bksl-nlassert sommepy-undmax([1, -2, 3, 10, -4, 7, 2, -5]) == 18bksl-nlbksl-nlbksl-nldef sommepy-undmax(tab):bksl-nl n = len(tab)bksl-nl sommespy-undmax = [0] py-str nbksl-nl sommespy-undmax[0] = tab[0]bksl-nl # on calcule la plus grande somme se terminant en ibksl-nl for i in range(1, n):bksl-nl if sommespy-undmax[i - 1] + tab[i] > tab[i]:bksl-nl sommespy-undmax[i] = sommespy-undmax[i - 1] + tab[i]bksl-nl else:bksl-nl sommespy-undmax[i] = tab[i]bksl-nl # on en déduit la plus grande somme de celles-cibksl-nl maximum = 0bksl-nl for i in range(1, n):bksl-nl if sommespy-undmax[i] > sommespy-undmax[maximum]:bksl-nl maximum = ibksl-nl return sommespy-undmax[maximum]bksl-nl bksl-nl