Numérique et sciences informatiques (NSI) · Terminale

La programmation dynamique

La version récursive naïve de Fibonacci recalcule sans cesse les mêmes valeurs. La programmation dynamique évite ce gaspillage : on résout chaque sous-problème une seule fois et on mémorise son résultat. Cette idée simple transforme des algorithmes exponentiels en algorithmes rapides, et permet de résoudre des problèmes d’optimisation comme le rendu de monnaie ou l’alignement de séquences d’ADN.

Une question sur ce cours ?

ULU, le tuteur d’ULUMINE, t’aide à partir de ce cours.

Séance guidée avec ULU (≈ 10 min)Diagnostic, explication, exercices adaptés et bilan.

Objectifs

  • Reconnaître un problème dont les sous-problèmes se chevauchent
  • Mémoïser une fonction récursive avec un dictionnaire
  • Écrire une version ascendante (itérative) qui remplit un tableau
  • Résoudre le rendu de monnaie et comprendre le principe de l’alignement de séquences

1. Le principe

Comme pour diviser pour régner, on exprime la solution d’un problème à partir de solutions de sous-problèmes. Mais ici, les sous-problèmes se chevauchent : le même sous-problème apparaît de nombreuses fois. fib(5) appelle fib(3) deux fois, fib(2) trois fois…

  • Mémoïsation (approche descendante) : on garde la fonction récursive, mais on stocke chaque résultat calculé dans un dictionnaire ; avant de calculer, on regarde s’il est déjà connu.
  • Approche ascendante : on calcule les sous-problèmes du plus petit au plus grand en remplissant un tableau, sans récursivité.

2. Le rendu de monnaie

On veut rendre une somme avec le moins de pièces possible, chaque valeur de pièce étant disponible en quantité illimitée. L’algorithme glouton (prendre à chaque fois la plus grande pièce possible) est optimal pour le système de l’euro, mais pas pour tous les systèmes.

3. Alignement de séquences

En biologie, on compare des séquences d’ADN ; un correcteur orthographique compare des mots. Une mesure classique est la distance d’édition : le nombre minimal d’opérations (insertion, suppression ou remplacement d’une lettre) pour passer d’un mot à l’autre.

À retenir

  • Programmation dynamique : sous-problèmes qui se chevauchent, chacun résolu une seule fois.
  • Mémoïsation : récursivité + dictionnaire des résultats déjà calculés.
  • Approche ascendante : remplir un tableau du plus petit au plus grand sous-problème.
  • Rendu de monnaie : nb(v) = 1 + min nb(v − p) ; le glouton n’est pas toujours optimal.
  • Distance d’édition : tableau D(i, j) rempli à partir des cases voisines.

Et maintenant, à toi !

Vérifie que tu as compris avec les exercices, puis révise avec la fiche.

À découvrir aussi