Documente Academic
Documente Profesional
Documente Cultură
programării
dinamice
Tipul problemelor rezolvabile prin tehnica
programării dinamice
●Programarea dinamică este o metodă de
rezolvare a unor probleme în care se cere de regulă
determinarea unei valori maxime sau minime, sau
numărarea elementelor unei mulțimi.
Substructura Subprobleme
optimală superpozabile
• Problema poate fi descompusă in • Subproblemele nu sunt
subprobleme, iar soluțiile optime ale independente, ci se suprapun.
subproblemelor determină soluția optimă a Soluțiile subproblemelor se vor
problemei inițiale (în acest caz s-ar putea aplica reține într-un tablou (vector sau
și una dintre metodele Greedy sau Divide-et- matrice).
Impera).
Etapele rezolvării unei probleme utilizând
metoda programării dinamice
Problemă:
Problemă:
Se dă o scară cu N trepte. Un individ se află în partea de jos a
scării și poate să urce câte o treaptă la un pas, sau câte două trepte
la un pas. În câte moduri poate urca scara?
• 1111
• 112
• 121
• 211
• 22
Rezolvare:
Este problemă de numărare; dacă numerotăm treptele, observăm că pe treapta N se poate ajunge
de pe treapta N-1 (cu un pas de o treaptă) sau de pe treapta N-2 (cu un pas de două trepte),
cazurile N=1 și N=2 fiind particulare.
Atunci, numărul de variate de a urca N trepte este egal cu numărul de variante de a urca N-1
trepte, plus numărul de variante de a urca N-2 trepte. Deducem deci următoarea relație de
recurență, în care T(n) reprezintă numărul de modalități de a urca o scară cu n trepte:
Constatăm că formula anterioară respectă proprietățile descrise mai sus pentru probleme
rezolvabile prin programare dinamică: subprobleme de același tip, de dimensiuni mai mici și care
se suprapun; în determinarea lui T(n) intervine T(n−1) și T(n−2). În determinarea lui T(n−1)
apare din nou T(n−2), ș.a.m.d., situație care face ca utilizarea recursivității să fie foarte
ineficientă.
De fapt, putem observa că formula de mai sus este de fapt definiția șirului lui Fibonacci, despre
care am văzut deja că are o soluție de complexitate O(n), construind termenii în ordine
crescătoare, folosind eventual un tablou unidimensional (sau doar trei variabile simple).
●Odată identificată relația de recurență, este necesară stabilirea unui algoritm de rezolvare
a recurenței. Datorită suprapunerii subproblemelor, utilizarea recursivității este foarte
neeficientă. De regulă se folosește o structură de date suplimentară – tablou unidimensional,
bidimensional sau cu mai multe dimensiuni (în funcție de numărul variabilelor care intervin
în relația de recurență).
●Soluția problemei se află într-un element al tabloului sau se poate determina folosind o
parte a elementelor acestuia. Elementele tabloului se vor determina unul câte unul, până când
sunt determinate toate elementele necesare pentru aflarea soluției!
●Pentru problema scării, notăm tabloul necesar cu V[]. Este un tablou unidimensional
deoarece în relația de recurență apare o singură variabilă (n); formula recursivă devine:
V[1] = 1, V[2]=2;
V[n] = V[n-1] + V[n-2], pentru n>2;
○ Inițializăm primele două elemente ale tabloului, iar celelalte elemente vor fi
construite unul după altul, de la stânga spre dreapta. Rezultatul se va găsi în V[n].
Program C++: Afișarea rezultatului:
Explicație: