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

Algorithmique · Écoles d'ingénieurs — ENSIAS

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 (PD) est une méthode algorithmique utilisée pour résoudre des problèmes d'optimisation en décomposant le problème en sous-problèmes plus simples. Contrairement à "diviser pour régner", la PD s'applique quand les sous-problèmes se chevauchent (sont calculés plusieurs fois). Deux conditions nécessaires :

  1. Sous-structure optimale : La solution optimale du problème global contient les solutions optimales des sous-problèmes.
  2. Sous-problèmes chevauchants : Les mêmes sous-problèmes sont résolus de manière répétée.

Méthodes à maîtriser

  1. Approche Top-Down (Mémoïsation) : On utilise la récursivité et on stocke le résultat dans un tableau (ou dictionnaire) dès qu'il est calculé.
  2. Approche Bottom-Up (Tabulation) : On remplit un tableau de manière itérative, en commençant par les cas de base jusqu'à atteindre la solution finale.

Exemples corrigés

Exemple : Suite de Fibonacci

  • Récursif simple : $F(n) = F(n-1) + F(n-2)$ avec $F(0)=0, F(1)=1$. Complexité $O(2^n)$.
  • PD (Tabulation) : Créer un tableau T de taille $n+1$. T[0]=0; T[1]=1; pour i de 2 à n: T[i] = T[i-1] + T[i-2]. Complexité $O(n)$.

Erreurs fréquentes

  • Oublier d'initialiser le tableau de mémoïsation (ex: mettre -1 pour indiquer "non calculé").
  • Confondre PD et algorithme glouton (le glouton ne garantit pas l'optimalité globale).
  • Ne pas définir correctement l'état de la récurrence.

🌉 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 caractéristique principale des problèmes résolubles par programmation dynamique ?

❓ Questions fréquentes

Qu'est-ce qui différencie la programmation dynamique de l'approche "Diviser pour régner" ?

La différence majeure réside dans le chevauchement des sous-problèmes. Dans "Diviser pour régner" (ex: Tri fusion), les sous-problèmes sont indépendants. En programmation dynamique, les sous-problèmes se répètent. La PD utilise la mémoire pour éviter de recalculer ces répétitions.

💡 À retenir : Si les sous-problèmes sont indépendants, utilisez "Diviser pour régner". S'ils se chevauchent, utilisez la programmation dynamique.

Kifach n3ref bli had l'exercice khasso l'programmation dynamique machi l'algorithme glouton ?

L'algorithme glouton (Greedy) fait des choix locaux optimaux à chaque étape sans revenir en arrière. Si ces choix locaux ne mènent pas à une solution globale optimale, alors le problème nécessite la programmation dynamique, qui explore toutes les combinaisons possibles de manière efficace.

💡 À retenir : Si le choix glouton ne fonctionne pas, il faut envisager la programmation dynamique.

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

Oui, en termes de temps d'exécution (complexité temporelle), car elle réduit le nombre de calculs exponentiels en calculs polynomiaux. Cependant, elle consomme plus de mémoire (complexité spatiale) pour stocker les résultats intermédiaires.

💡 À retenir : C'est un compromis temps-mémoire (Space-Time Tradeoff).

Chno hiya "l'état" f programmation dynamique ?

L'état est l'ensemble des paramètres qui définissent de manière unique un sous-problème. Par exemple, dans le problème du sac à dos, l'état est (i, w) où i est l'indice de l'objet et w est le poids restant.

💡 À retenir : Bien définir l'état est la clé pour écrire la relation de récurrence.

Kifach n7seb l'complexité spatiale dyal l'algorithme ?

La complexité spatiale est déterminée par la taille de la structure de données (tableau) utilisée pour stocker les résultats. Si tu utilises un tableau à deux dimensions de taille $N \times M$, la complexité est $O(N \times M)$.

💡 À retenir : Identifie la dimension de ton tableau de stockage.

Est-ce qu'on peut toujours transformer une approche récursive en approche itérative ?

Oui, toute solution récursive peut être transformée en une solution itérative (Bottom-Up) en utilisant une pile ou en remplissant un tableau dans l'ordre inverse de la récursion.

💡 À retenir : L'approche itérative est souvent préférée pour éviter les débordements de pile (Stack Overflow).

Pourquoi on utilise souvent un tableau de taille n+1 ?

On utilise $n+1$ pour inclure le cas de base (souvent l'indice 0 ou 1) et pour que l'indice $n$ soit accessible directement dans le tableau.

💡 À retenir : Toujours vérifier les bornes de ton tableau pour éviter les erreurs d'index hors limites.

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

Oui, par exemple pour trouver le plus court chemin dans un graphe orienté acyclique (DAG) ou pour l'algorithme de Floyd-Warshall.

💡 À retenir : La PD est un outil puissant pour les problèmes de chemins optimaux.

Wach l'programmation dynamique katkhdm ghir f l'optimisation ?

Principalement oui, pour minimiser ou maximiser une valeur. Mais elle peut aussi servir à compter le nombre de façons d'atteindre un état (ex: nombre de chemins possibles).

💡 À retenir : L'optimisation est le cas d'usage classique, mais le dénombrement est aussi possible.

Comment choisir entre mémoïsation et tabulation ?

La mémoïsation est plus intuitive si tu connais déjà la solution récursive. La tabulation est souvent plus performante car elle évite la surcharge des appels de fonctions récursives.

💡 À retenir : La tabulation est généralement préférée en production pour sa stabilité.

Est-ce que le programme officiel inclut la programmation dynamique sur les arbres ?

Le programme se concentre sur les structures linéaires et les graphes. La PD sur les arbres est une extension, mais les principes de base (sous-problèmes) restent les mêmes.

💡 À retenir : Maîtrise d'abord la PD sur les tableaux avant d'aborder les arbres.

Est-ce qu'on peut réduire la mémoire utilisée en PD ?

Oui, si le calcul d'un état ne dépend que de l'état précédent (ex: $T[i]$ dépend seulement de $T[i-1]$), on peut utiliser seulement deux variables au lieu d'un tableau complet.

💡 À retenir : C'est l'optimisation spatiale, très appréciée lors des examens.

✍️ Exercices type examen national

Exercice 1

On considère le problème du "Nombre de chemins" dans 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. Écrire une fonction en pseudo-code utilisant la programmation dynamique pour calculer le nombre total de chemins.

Voir la correction détaillée : inscription gratuite

Exercice 2

Soit une suite $S$ définie par $S(n) = S(n-1) + 2 \times S(n-2)$ avec $S(0)=1, S(1)=1$. Écrire un algorithme optimisé en espace (complexité spatiale $O(1)$) pour calculer $S(n)$.

Voir la correction détaillée : inscription gratuite

Exercice 3

Problème du rendu de monnaie : Étant donné un ensemble de pièces $P = {p_1, p_2, ..., p_k}$ et une somme $S$, trouver le nombre minimum de pièces pour atteindre $S$. Proposer une approche de programmation dynamique.

Voir la correction détaillée : inscription gratuite

Un prof de Algorithmique 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 Algorithmique