Najah.
Mon plan de révision⚡ Défi flash

Informatique · Classes prépa (CPGE) — 2ème année — TSI

Programmation dynamique

Le cours expliqué simplement, les questions que tous les élèves se posent et des exercices type examen national. Programme marocain, gratuit.

📘 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 :

  1. Une sous-structure optimale : la solution optimale du problème global contient les solutions optimales des sous-problèmes.
  2. 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 tab de 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).

🌉 Jisr : les mots du chapitre FR ⇄ AR

Tu as appris les sciences en arabe ? Touche un mot pour voir sa traduction et une explication en darija.

La question que tu n'oses pas poser en classe ? Pose-la à UstadZéro jugement, même en darija, même à minuit. Il t'explique pas à pas et corrige ta démarche. Gratuit.

Défi flash : 4 questions

Sans compte

🎯 Programmation dynamique

1/4

Quelle est la condition nécessaire pour appliquer la programmation dynamique ?

❓ Questions fréquentes

Qu'est-ce qui différencie la programmation dynamique de la récursion simple ?

La récursion simple recalcule les mêmes sous-problèmes plusieurs fois, ce qui entraîne une complexité souvent exponentielle. La programmation dynamique, elle, stocke le résultat de chaque sous-problème dans une mémoire (tableau ou dictionnaire) dès qu'il est calculé. Ainsi, chaque sous-problème n'est résolu qu'une seule fois.

💡 À retenir : La programmation dynamique transforme une complexité exponentielle en une complexité polynomiale grâce au stockage.

Kifach n3ref wach khassni nst3mel programmation dynamique f chi exercice ?
  1. Chof wach l mochkil momkin n9smoh l machakil sghira (sous-problèmes).
  2. Chof wach l7l dyal l mochkil l kbir kayt3temed 3la l7l dyal l machakil sghira (sous-structure optimale).
  3. Chof wach l khwarizmiya katsm3 l nafs l mochkil bzaf d l mrat (chevauchement).

💡 À retenir : Ila ban lik l'algorithme récursif kay3awed nafs l7sab bzaf, rah programmation dynamique hiya l7l.

Est-ce que la programmation dynamique est toujours plus rapide ?

Oui, pour les problèmes présentant des sous-problèmes qui se chevauchent. Cependant, elle consomme plus de mémoire (espace) pour stocker les résultats intermédiaires. Si le problème ne présente pas de chevauchement, la programmation dynamique n'apporte aucun gain de performance.

💡 À retenir : C'est un compromis temps-mémoire (Time-Memory Trade-off).

Chno hiya l far9 bin top-down w bottom-up ?
  1. Top-down (mémoïsation) : Kanbdaou mn l mochkil l kbir w kanst3mlo récursion, w fach kanl9aw l7l kanstokiwah.
  2. Bottom-up (itérative) : Kanbdaou mn l7alat l basiya (cas de base) w kanbniw l7l 7ta kanwslou l l7l l kbir bla ma nst3mlo récursion.

💡 À retenir : Bottom-up katkon souvent plus rapide 7it mmafihach l'overhead dyal l'appel récursif.

Comment choisir la taille du tableau pour la programmation dynamique ?

La taille du tableau dépend du nombre d'états nécessaires pour définir chaque sous-problème. Si le problème dépend d'un paramètre $n$, on utilise généralement un tableau de taille $n+1$. S'il dépend de deux paramètres $n$ et $m$, on utilise une matrice de taille $(n+1) \times (m+1)$.

💡 À retenir : La dimension du tableau correspond au nombre de variables qui changent dans les appels récursifs.

Est-ce que la programmation dynamique est utilisée pour les graphes ?

Oui, par exemple pour trouver le plus court chemin dans un graphe acyclique orienté (DAG) ou pour l'algorithme de Floyd-Warshall qui calcule les plus courts chemins entre toutes les paires de sommets.

💡 À retenir : La programmation dynamique est un outil puissant pour optimiser les parcours dans les graphes.

Kifach n7seb l complexité spatiale dyal l'algorithme ?

La complexité spatiale correspond à la taille de la structure de données utilisée pour stocker les résultats (le tableau ou la matrice). Si tu utilises un tableau de taille $n$, la complexité est $O(n)$. Si tu utilises une matrice $n \times m$, elle est $O(n \times m)$.

💡 À retenir : Il faut toujours compter l'espace mémoire supplémentaire alloué pour la mémoïsation.

Peut-on optimiser l'espace mémoire en programmation dynamique ?

Oui, souvent. Si pour calculer l'état $i$, on n'a besoin que des états $i-1$ et $i-2$, on n'a pas besoin de stocker tout le tableau. On peut utiliser seulement deux ou trois variables pour garder les valeurs nécessaires.

💡 À retenir : C'est l'optimisation de l'espace, très utile quand $n$ est très grand.

Est-ce que la programmation dynamique est au programme pour les TSI ?

Oui, elle fait partie intégrante du programme de 2ème année CPGE pour la filière TSI, dans le cadre de l'étude des algorithmes d'optimisation.

💡 À retenir : Maîtriser la transition entre récursion et programmation dynamique est un point clé pour le concours.

Pourquoi dit-on que la programmation dynamique est une approche "ascendante" ?

On l'appelle ascendante (bottom-up) parce qu'on résout d'abord les plus petits sous-problèmes (les bases), puis on utilise ces résultats pour construire la solution des problèmes de plus en plus grands, jusqu'à atteindre le problème initial.

💡 À retenir : On construit la solution brique par brique.

Qu'est-ce qu'une "sous-structure optimale" ?

C'est une propriété où la solution optimale d'un problème global peut être construite à partir des solutions optimales de ses sous-problèmes. Par exemple, le plus court chemin entre A et C passant par B est la somme du plus court chemin A-B et du plus court chemin B-C.

💡 À retenir : Sans sous-structure optimale, la programmation dynamique ne fonctionne pas.

Est-ce que la programmation dynamique est utile pour le tri ?

Non, les algorithmes de tri classiques (Tri fusion, Tri rapide) utilisent plutôt la méthode "Diviser pour régner". La programmation dynamique est spécifique aux problèmes d'optimisation avec chevauchement.

💡 À retenir : Ne pas confondre les paradigmes algorithmiques.

✍️ Exercices type examen national

Exercice 1

On considère le problème du "rendu de monnaie" : étant donné un montant $S$ et une liste de pièces de valeurs $V = [v_1, v_2, ..., v_n]$, trouver le nombre minimum de pièces nécessaires pour atteindre $S$.

  1. Proposer une relation de récurrence pour $f(s)$, le nombre minimum de pièces pour le montant $s$.
  2. Écrire une fonction Python utilisant la programmation dynamique (approche bottom-up) pour résoudre ce problème.
Voir la correction détaillée : inscription gratuite

Exercice 2

Soit une grille de taille $n \times m$. On veut aller de la case $(0,0)$ à la case $(n-1, m-1)$ en ne se déplaçant que vers le bas ou vers la droite. Chaque case $(i, j)$ contient une valeur $C[i][j]$. Le but est de maximiser la somme des valeurs des cases traversées.

  1. Définir la relation de récurrence.
  2. Donner la complexité temporelle de l'algorithme.
Voir la correction détaillée : inscription gratuite

Exercice 3

On souhaite calculer le nombre de chemins possibles dans une grille $n \times m$ pour aller de $(0,0)$ à $(n-1, m-1)$ avec des déplacements vers le bas ou la droite.

  1. Expliquer pourquoi la programmation dynamique est plus efficace que la récursion simple.
  2. Écrire l'algorithme itératif.
Voir la correction détaillée : inscription gratuite

Un prof de Informatique pour aller plus loin

Les cours du soir avec des profs vérifiés arrivent : inscris-toi pour être prévenu(e) en premier.

Être prévenu(e) gratuitement

Autres chapitres de Informatique