---
title: "Programare dinamică"
source: "https://systems-analysis.info/int/Programare_dinamic%C4%83"
wiki: "systems-analysis.info/int"
article: "Programare_dinamică"
language: "ro"
categories:
  - "Category:Operations research"
  - "Category:Romanian"
revision_id: 5879
wiki_created_at: 2026-09-06T23:55:20Z
wiki_modified_at: 2026-09-06T23:55:20Z
downloaded_at: 2026-09-07T23:10:50Z
---

# Programare dinamică

**Programarea dinamică** (**PD**; engl. *dynamic programming, DP*) — este o metodă de rezolvare a problemelor complexe de optimizare, bazată pe descompunerea problemei inițiale într-o secvență de subprobleme mai simple<sup>[\[1\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-bigenc-dp-1)[\[2\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-ru-wiki-dp-2)</sup>. Metoda se aplică proceselor de luare a deciziilor în mai mulți pași, unde soluția optimă a întregii probleme poate fi construită din soluțiile optime ale subproblemelor sale.

Termenul a fost introdus de matematicianul american Richard Bellman în anii 1950<sup>[\[3\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-rechetnikov-dp-3)</sup>. În acest context, cuvântul „programare" este folosit cu sensul de „planificare" sau „elaborarea unui plan optim de acțiune", și nu de scriere a unui cod de calculator<sup>[\[4\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-en-wiki-dp-4)</sup>.

## Proprietăți cheie și teoreme

Aplicabilitatea programării dinamice la o problemă este determinată de prezența a două proprietăți fundamentale ale acesteia.

### Principiul optimalității Bellman

Conceptul central al metodei este **principiul optimalității Bellman** (engl. *Bellman's principle of optimality*). Acesta afirmă: indiferent de starea inițială și de decizia inițială, deciziile ulterioare trebuie să constituie o strategie optimă în raport cu starea obținută ca urmare a primei decizii<sup>[\[3\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-rechetnikov-dp-3)</sup>.

Cu alte cuvinte, orice porțiune a traiectoriei optime este, prin ea însăși, optimă. Această proprietate permite descompunerea problemei generale într-o secvență de subprobleme mai simple și rezolvarea lor recursivă.

### Subprobleme suprapuse

O problemă posedă proprietatea **subproblemelor suprapuse** (engl. *overlapping subproblems*) dacă, în cursul rezolvării sale recursive, aceleași subprobleme apar în mod repetat. PD permite evitarea calculelor redundante prin stocarea soluțiilor subproblemelor deja întâlnite (această tehnică se numește memoizare sau tabulare), ceea ce crește semnificativ eficiența față de căutarea recursivă naivă.

## Ecuația Bellman

Din principiul optimalității decurge relația de recurență fundamentală a metodei — **ecuația Bellman**<sup>[\[1\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-bigenc-dp-1)</sup>. Aceasta leagă „valoarea" (câștigul optim sau costul) stării curente de valorile stărilor ulterioare. În forma sa generală, pentru un proces determinist în mai mulți pași cu funcție obiectiv aditivă, ea are forma:

$$
V_{k - 1}(x) = \max\limits_{y \in U(x)}\{\varphi_{k}(x,y) + V_{k}(f_{k}(x,y))\}
$$

unde:

- $k$ — numărul pasului (de la $m$ la 1);
- $x$ — starea sistemului la pasul $k - 1$;
- $y$ — decizia controlabilă luată la pasul $k$;
- $\varphi_{k}(x,y)$ — câștigul (sau costul) la pasul k;
- $f_{k}(x,y)$ — funcția care determină noua stare a sistemului;
- $V_{k}(s)$ — valoarea optimă a funcției obiectiv pentru subproblema care începe la pasul $k$ în starea $s$.

Ecuația se rezolvă secvențial, de regulă „de la sfârșit", deplasându-se de la ultimul pas către primul.

## Exemple de aplicare

- **Problema drumului cel mai scurt într-un graf**: Această problemă posedă proprietatea substructurii optime, deoarece orice porțiune a drumului cel mai scurt este ea însăși cel mai scurt drum. Algoritmii Bellman-Ford și Floyd-Warshall sunt exemple clasice de aplicare a PD pentru rezolvarea acestei probleme<sup>[\[5\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-mit-amp-5)</sup>.
- **Problema rucsacului**: Problema umplerii optime a unui rucsac cu capacitate limitată cu obiecte de valori și greutăți diferite. PD permite rezolvarea acestei probleme prin examinarea secvențială a obiectelor și calcularea, la fiecare pas, a valorii maxime pentru toate valorile posibile ale capacității rămase.
- **Problema alocării resurselor**: Distribuirea unei resurse limitate (de exemplu, investiții) între mai multe proiecte în vederea maximizării efectului total.

## Limitări

Principala limitare a metodei este **blestemul dimensionalității** (engl. *curse of dimensionality*) — termen introdus de Bellman pentru a desemna creșterea exponențială a numărului de stări și, implicit, a complexității computaționale, odată cu creșterea numărului de variabile care descriu starea sistemului<sup>[\[6\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-ru-wiki-curse-6)[\[7\]](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_note-utexas-ormm-7)</sup>. Aceasta limitează aplicarea practică a PD exacte pentru probleme de dimensiuni foarte mari.

## Noțiuni conexe

- Cercetarea operațională
- Teoria controlului optim
- Procesul de decizie Markov (generalizare stochastică)
- Ecuația Hamilton — Jacobi — Bellman (analogul pentru timp continuu)

## Note

1.  <span id="cite_note-bigenc-dp-1">↑ <sup>[1.0](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-bigenc-dp_1-0)</sup> <sup>[1.1](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-bigenc-dp_1-1)</sup> "Динамическое программирование". *Большая российская энциклопедия*. <a href="https://bigenc.ru/c/dinamicheskoe-programmirovanie-00423a" class="external autonumber" rel="nofollow">[1]</a></span>
2.  <span id="cite_note-ru-wiki-dp-2">[↑](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-ru-wiki-dp_2-0) "Динамическое программирование". *Википедия*. <a href="https://ru.wikipedia.org/wiki/Динамическое_программирование" class="external autonumber" rel="nofollow">[2]</a></span>
3.  <span id="cite_note-rechetnikov-dp-3">↑ <sup>[3.0](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-rechetnikov-dp_3-0)</sup> <sup>[3.1](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-rechetnikov-dp_3-1)</sup> Решетников А. Н., Коченков А. В., Пиров Д. М., Рябоконь Д. А. (2011). *Динамическое программирование. Примеры применения*. Учебное пособие, ННГУ им. Лобачевского (ВМиК). <a href="https://itslearningakarmazyan.files.wordpress.com/2015/09/dynamic-programming.pdf" class="external autonumber" rel="nofollow">[3]</a></span>
4.  <span id="cite_note-en-wiki-dp-4">[↑](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-en-wiki-dp_4-0) "Dynamic programming". *Wikipedia*. <a href="https://en.wikipedia.org/wiki/Dynamic_programming" class="external autonumber" rel="nofollow">[4]</a></span>
5.  <span id="cite_note-mit-amp-5">[↑](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-mit-amp_5-0) Bradley S. P., Hax A. C., Magnanti T. L. (1977). *Applied Mathematical Programming*. Addison-Wesley. <a href="http://web.mit.edu/15.053/www/AMP-Chapter-11.pdf" class="external autonumber" rel="nofollow">[5]</a></span>
6.  <span id="cite_note-ru-wiki-curse-6">[↑](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-ru-wiki-curse_6-0) "Проклятие размерности". *Википедия*. <a href="https://ru.wikipedia.org/wiki/Проклятие_размерности" class="external autonumber" rel="nofollow">[6]</a></span>
7.  <span id="cite_note-utexas-ormm-7">[↑](https://systems-analysis.info/int/Programare_dinamic%C4%83#cite_ref-utexas-ormm_7-0) Jensen P. A. (2004). *Dynamic Programming – Models*. Operations Research Models and Methods, Univ. of Texas. <a href="https://utw11041.utweb.utexas.edu/ORMM/models/unit/dynamic/index.html" class="external autonumber" rel="nofollow">[7]</a></span>
