📘 Fiche de cours
L'essentiel du cours
La programmation dynamique est une méthode algorithmique utilisée pour résoudre des problèmes complexes en les décomposant en sous-problèmes plus simples, en résolvant chaque sous-problème une seule fois et en stockant les résultats pour éviter les calculs redondants. Elle s'applique aux problèmes présentant :
- Une sous-structure optimale : la solution optimale du problème global contient les solutions optimales des sous-problèmes.
- Des sous-problèmes qui se chevauchent : le même sous-problème est résolu plusieurs fois.
Méthodes à maîtriser
- Mémoïsation (Top-down) : Utiliser une structure de données (dictionnaire ou tableau) pour stocker les résultats des appels récursifs.
- Approche itérative (Bottom-up) : Remplir un tableau de manière itérative en commençant par les cas de base jusqu'à la solution finale.
Exemples corrigés
Exemple : Suite de Fibonacci
- Approche récursive simple : $F(n) = F(n-1) + F(n-2)$. Complexité exponentielle $O(2^n)$.
- Approche dynamique : Utiliser un tableau
tabde taille $n+1$ oùtab[i] = tab[i-1] + tab[i-2]. Complexité linéaire $O(n)$.
Erreurs fréquentes
- Oublier de stocker le résultat d'un sous-problème (perte de l'avantage de la méthode).
- Mauvaise initialisation du tableau de mémoïsation.
- Confondre la programmation dynamique avec l'algorithme "Diviser pour régner" (ici, les sous-problèmes ne sont pas indépendants).