La programmation dynamique est une technique algorithmique fondamentale en informatique, utilisée pour résoudre efficacement des problèmes complexes en les décomposant en sous-problèmes plus simples. Elle est particulièrement utile lorsque ces sous-problèmes se répètent et que leurs solutions peuvent être réutilisées.
La programmation dynamique (Dynamic Programming – DP) consiste à résoudre un problème en le divisant en sous-problèmes plus petits, à stocker les résultats de ces sous-problèmes, puis à les réutiliser afin d’éviter des calculs redondants. Contrairement à une approche naïve récursive qui recalculerait plusieurs fois les mêmes valeurs, la programmation dynamique optimise le temps d’exécution en mémorisant les résultats intermédiaires.
Elle repose sur deux principes fondamentaux :
On utilise la programmation dynamique lorsqu’un problème présente :
Des exemples classiques incluent : le calcul du plus court chemin, le problème du sac à dos (Knapsack), les suites numériques (comme Fibonacci), ou encore les problèmes de planification.
Voici quelques questions à se poser :
Si la réponse est oui à plusieurs de ces questions, la programmation dynamique est probablement adaptée.
Il existe principalement deux manières d’implémenter la programmation dynamique :
On utilise une approche récursive classique, mais on stocke les résultats déjà calculés dans une structure (tableau ou dictionnaire). Avant de recalculer une valeur, on vérifie si elle existe déjà.
On construit progressivement la solution en remplissant un tableau à partir des cas de base. Cette approche est souvent plus performante car elle évite la surcharge liée à la récursion.
La suite de Fibonacci est définie comme suit :
Les premiers termes sont :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
Le problème consiste à calculer F(n).
Une implémentation simple en récursif serait :
F(n):
si n == 0 retourner 0
si n == 1 retourner 1
retourner F(n-1) + F(n-2)
Si on calcule F(6), voici ce qui se passe :
F(6)
→ F(5) + F(4)
→ (F(4) + F(3)) + (F(3) + F(2))
→ ...
On remarque que :
Il y a donc chevauchement de sous-problèmes.
La complexité devient exponentielle : O(2ⁿ) → très inefficace.
Le problème vérifie les deux conditions essentielles :
Conclusion : Programmation dynamique adaptée à cette problématique.
On garde la récursion, mais on mémorise les résultats déjà calculés.
Avant de calculer F(n), on vérifie si on l’a déjà calculé.
memo = tableau vide
F(n):
si n dans memo:
retourner memo[n]
si n == 0:
retourner 0
si n == 1:
retourner 1
memo[n] = F(n-1) + F(n-2)
retourner memo[n]
La programmation dynamique est donc un outil puissant pour optimiser des algorithmes.
La programmation dynamique n’est pas simplement une technique d’optimisation, c’est une manière de penser les problèmes en termes de sous-structures réutilisables.
Savoir reconnaître les situations où elle s’applique est une compétence essentielle pour tout étudiant en informatique souhaitant maîtriser la conception d’algorithmes efficaces.
Coach Technique
Student Success Manager