Adloun

Problème — Sous-tableau de somme maximale

Application directe du cours · niveau 3 (difficile) · NSI (terminale), chapitre 6 — Diviser pour régner

Énoncé

Problème — Sous-tableau de somme maximale.

Étant donné un tableau d'entiers (positifs ou négatifs), trouver la plus grande somme d'un sous-tableau contigu, par une approche « diviser pour régner ».

Corrigé

on coupe le tableau au milieu. La somme maximale est soit entièrement à gauche, soit entièrement à droite, soit à cheval sur le milieu. Ce dernier cas se calcule en partant du milieu vers la gauche puis vers la droite.


def somme_centre(tab, g, m, d):
    # meilleure somme finissant en m (cote gauche)
    s, gauche = 0, float("-inf")
    for k in range(m, g - 1, -1):
        s += tab[k]
        gauche = max(gauche, s)
    # meilleure somme commencant en m+1 (cote droit)
    s, droite = 0, float("-inf")
    for k in range(m + 1, d + 1):
        s += tab[k]
        droite = max(droite, s)
    return gauche + droite

def somme_max(tab, g, d):
    if g == d:                       # cas de base
        return tab[g]
    m = (g + d) // 2
    return max(somme_max(tab, g, m),
               somme_max(tab, m + 1, d),
               somme_centre(tab, g, m, d))

def sous_tableau_max(tab):
    return somme_max(tab, 0, len(tab) - 1)

La complexité est , contre pour l'approche naïve qui testerait tous les sous-tableaux. (L'algorithme de Kadane fait même , mais n'utilise pas le paradigme étudié ici.)

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.