Pe scurt
Programarea dinamică rezolvă subprobleme și le păstrează rezultatele pentru a nu le recalcula. Dacă vrem numărul de moduri de a urca trepte făcând pași de 1 sau 2, ultima mișcare vine fie de la , fie de la . Cu și , obținem , , .
În detaliu
Programarea dinamică rezolvă o problemă prin descompunerea ei în subprobleme care se suprapun și prin memorarea răspunsurilor, ca fiecare subproblemă să fie calculată o singură dată. Se definește starea (ce înseamnă valoarea memorată, de pildă = numărul de moduri de a ajunge la treapta ), cazurile de bază (valorile cunoscute direct) și recurența, care exprimă o stare din stările mai mici. Calculul se face în ordinea în care dependențele sunt deja cunoscute, de obicei crescător. Fără definirea precisă a stării, recurența singură nu determină rezultatul. Dacă o stare depinde numai de ultimele două, nu este nevoie să memorezi tot tabloul, iar memoria se reduce la constantă.
Exemplul 1 — urcarea pe trepte. Se urcă trepte, făcând pași de 1 sau de 2 trepte. Ultimul pas vine fie de la treapta , fie de la , deci , cu și .
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 4;
vector<int> d(n + 1);
d[0] = 1;
if (n >= 1) d[1] = 1;
for (int i = 2; i <= n; ++i)
d[i] = d[i - 1] + d[i - 2];
cout << d[n];
return 0;
}
Valorile sunt , deci pentru se afișează 5; pentru șirul continuă cu 8, 13, 21. Numărul de calcule este proporțional cu , spre deosebire de recursia naivă, care repetă subprobleme și face un număr exponențial de apeluri.
Exemplul 2 — numărul minim de monede. Cu monedele 1, 3 și 4, este numărul minim de monede care dau suma . Recurența este , luând minimul după monedele , cu . Valorile pentru sunt: 0, 1, 2, 1, 1, 2, 2. Pentru minimul este 2 (3 + 3), în timp ce metoda greedy ar fi dat 3 monede (4 + 1 + 1). Programarea dinamică găsește optimul pentru orice sistem de monede, nu doar pentru cele „bune” pentru greedy.
int c[] = {1, 3, 4}, s = 6;
vector<int> d(s + 1, 1000000);
d[0] = 0;
for (int i = 1; i <= s; ++i)
for (int m : c)
if (m <= i && d[i - m] + 1 < d[i])
d[i] = d[i - m] + 1;
După execuție, d[6] este 2.
Exemplul 3 — drumuri într-o grilă. Într-o grilă cu 3 linii și 3 coloane, mergând numai spre dreapta sau în jos de la colțul din stânga sus la fiecare celulă, numărul de drumuri este , cu 1 pe prima linie și prima coloană. Tabelul are liniile , și , deci până în colțul din dreapta jos sunt 6 drumuri, egal cu . Fiecare celulă este calculată o singură dată din cele două vecine, deci timpul este proporțional cu numărul de celule.
Exemplul 4 — suma imposibilă și reconstituirea soluției. Cu monedele 2 și 5 unele sume nu se pot forma. Tabelul se începe cu o valoare foarte mare, care înseamnă „imposibil”, iar pentru rezultă: 0, , 1, , 2, 1, 3, 2. Suma 3 rămâne , pentru că nici , nici o monedă de 5 nu duc la o stare posibilă. Valoarea „imposibil” se verifică înainte de adunarea lui 1, altfel apar depășiri. Tabelul dă doar numărul de monede. Dacă la fiecare sumă se memorează și ultima monedă aleasă, soluția se reconstituie de la sfârșit: pentru monedele 1, 3, 4 și se memorează moneda 3, apoi, pentru suma rămasă 4, moneda 4, deci , în două monede.
Greșeli frecvente
- Greșit: programarea dinamică repetă calculul subproblemelor pentru a fi sigur.Corect: memorează răspunsurile ca să nu le recalculeze.
- Greșit: recurența determină rezultatul fără cazuri de bază.Corect: cazurile de bază și definiția stării sunt esențiale.
- Greșit: pentru monede, alegerea celei mai mari monede este întotdeauna optimă.Corect: pentru monedele 1, 3, 4 și suma 6 sunt necesare doar două monede, 3 + 3, iar greedy dă trei.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu
Documente consultate
- OMECI 5099/2009, anexa 5, Informatică XII mate-info, p. 4–5
- Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programele școlare noi de informatică pentru clasele X–XII (OMEC 4370/2026, MO 591 bis/20.07.2026), CNCE; rocnee.eu
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației; edu.ro
- Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
Desene: Redactare proprie (desen original), conform OMECI 5099/2009, anexa 5, Informatică XII; informatica.isj-db.ro
