Sunteți pe pagina 1din 4

Metoda programrii dinamice (PD)

Metoda programrii dinamice este o metod de programare care se aplic problemelor a cror soluie
se poate construi dinamic n timp, adic deciziile care conduc la obinerea rezultatului se pot lua pas cu
pas, pe baza deciziilor de la pasul/paii precedeni.
De obicei, metoda programrii dinamice este adecvat n cazul problemelor care solicit
determinarea unui optim (minim sau maxim), n urma unui proces decizional care se desfoar n mai
multe etape. , Astfel, se pornete de la o stare iniial i la fiecare pas se ia o decizie care determin o
nou stare, pn cnd se ajunge la soluia final, optim.
Iniiatorul metodei, profesorul i cercettorul Richard Bellman, a publicat n 1957 o carte cu titlul
Dynamic programming, n care a enunat principiul optimalitii:
O strategie are proprietatea c oricare ar fi starea iniial i decizia iniial, deciziile rmase
trebuie s constituie o strategie optim privitoare la starea care rezult din decizia anterioar.
Demonstrarea corectitudii algoritmului de rezolvare a unei probleme prin programare dinamic se
face, de cele mai multe ori, prin inducie matematic.
Metoda PD se poate aplica cu urmtoarele abordri:

Metoda nainte: pentru rezovarea problemei se pleac de la starea final

Metoda npoi: pentru rezovarea problemei se pleac de la starea iniial

Metoda mixt: o combinaie a primelor dou

n problemele care pot fi rezolvate utiliznd PD identificm dou proprieti:


a. substructura optimal problema poate fi descompus n subprobleme iar soluiile optime
ale subproblemelor determin soluia optim a problemei iniiale (n acest caz s-ar putea
aplica i una dintre metodele Greedy sau Divide-et-Impera)
b. subprobleme superpozabile subproblemele nu sunt independente ci se suprapun (Divideet-Impera nu se poate aplica; redundana foarte mari a operaiilor o face inutilizabil, vezi
Fibonacci); soluiile subproblemelor se vor reine ntr-un tablou (vector sau matrice)
Etapele rezolvrii unei probleme utiliznd metoda programrii dinamice
1. identificarea subproblemelor
2. alegerea unei structuri care s rein soluiile subproblemelor
3. determinarea unei relaii de recuren care s caracterizeze substructura optimal (dependena
soluiei subproblemei curente de soluiile subproblemelor n care se descompune)
4. rezolvarea recurenei n mod bottom-up (n ordinea cresctoare a dimensiunilor subproblemelor)
pentru determinarea souiei optime a problemei iniiale
Aplicaii

Subir cresctor maximal

Subir comun maximal

Sum n triunghi

Problema discret a rucsacului

1. Subir cresctor maximal


Fie sirul A=(a1, a2,an). Numim subir al irului A o succesiune de elemente din A, n
ordinea n care acestea apar n A, nu neaprat pe poziii consecutive. Pentru un sir dat,
determinai un subir cresctor de lungime maxim.
Exemplu: A=(8,3,6,50,10,8,100,30,60,40,80)
o soluie poate fi: (3,6,20,30,60,80)
Algoritm PD:
Etapa 1
Problema: determinarea celui mai lung subir cresctor al irului (a1, a2,an)
Subproblema: determinarea celui mai lung subir cresctor al irului, care ncepe la poziia k.
Etapa 2 structura de date pentru memorarea soluiilor pariale:
Construim vectorul Lmax(n),
Lmax[i]=lungimea celui mai lung subir cresctor care ncepe la poziia i
Construim vectorl urm(n)
urm[i]=indicele elementului care urmeaz lui a[i] n subirul cresctor maximal, dac
exist urmtor sau -1 dac nu exist alt element dup a[i]
(vetorul urm este necesar pentru reconstituirea subirului)
Soluia final a problemei va fi maximul din vectorul Lmax iar subirul cutat va ncepe la
pozmax, poziia la care apare acest maxim.
Etapa 3 - relaia de recuren
Lmax[n]=1, urm[n]=0;
Lmax[i]=max{Lmax[j]+1, daca a[i]<=a[j]},
urm[i]=indicele elementului pentru care s-a gsit maximul
Obs. Reconstituirea subirului maximal pe baza vectorului urm i a pozmax
for (i=pozmax; i!=-1; i=urm[i])
fout<<a[i]<< ;
2. Subir comun maximal
Fie X=(x1,x2,xn) i Y=(y1,y2,ym) dou iruri de numere ntregi. Determinai subirul
comun de lungime maxim.
Algoritm PD:
Etapa 1 - Subproblema: determinarea suirului comun maximal care ncepe pe poziia i n irul
X i pe poziia j n irul Y
Etapa 2 structura de date pentru memorarea soluiilor pariale:
Construim vectorul Lmax(n+1,m+1),
Lmax[i][j]=lungimea subirului comun maximal care ncepe la poziia i n X i la
poziia j n Y
Soluia final a problemei va fi Lmax[n][m] iar subirul comun va fi reconstituit cu ajutorul
acestei matrici.

Etapa 3 - relaia de recuren


Lmax[i][0]=0, i=1,...,n
Lmax[0][j]=0, j=1,...,m
Lmax[i][j]=Lmax[i-1][j-1]+1, daca X[i]=Y[j]
Lmax[i][j]=max{Lmax[i-1][j], Lmax[i][j-1], daca X[i]!=Y[j]}

3. Sum n triunghi
Se consider un triunghi format din n linii (1<n<=100), fiecare linie coninnd numere ntregi din
domeniul [1,99], ca n exemplul urmtor:
7
3
8

8
1

2
7
4
4
4
5
2
6
5
S se determine cea mai mare sum de numere aflate pe un drum ntre numrul de pe prima linie
i un numr de pe ultima linie. Fiecare numr din acest drum, cu excepia primului, este situat
imediat sub precedentul, la stnga sau la dreapta acestuia.
S se afieze suma maxim i un drum pe care se poate obine. Drumul este format din perechi
de indici lin col, scrise cte o pereche pe o linie.
Algoritm PD:
Etapa 1 - Subproblema: determinarea sumei maxime care se poate obine cu numerele aflate pe
un drum care ncepe cu a[i][j] i se termin pe ultima linie. (a(n,n), matricea n care se
memoreaz, sub diagonala principal, triunghiul de numere dat)
Etapa 2 structura de date pentru memorarea soluiilor pariale:
Construim matricea Smax(n,n),
Smax[i][j]= suma maxim care se poate obine cu numerele aflate pe un drum care
ncepe cu a[i][j] i se termin pe ultima linie
Soluia final a problemei va fi Smax[1][1] iar drumul pe care a fost construit va fi
reconstituit cu ajutorul matricilor S i a.
Etapa 3 - relaia de recuren7
Smax[n][i]=a[n][i];
Smax[i][j]=a[i][j]+max{Smax[i+1][j]+Smax[i+1][j+1] },
i=n-1,...1; j=1,...,i

4. Problema discret a rucsacului


Un ho are un rucsac cu care poate transporta o greutate maxima Gmax. El i poate umple
rucsacul cu obiecte selectate dintr-o mulime de n obiecte pe care le-a gsit, pentru care cunoate
greutatea gi i ctigul ci pe care l obine selectnd obiectul i. Un obiect poate fi luat doar n
ntregime.
S se determine o modaliatate de umplere a rucsacului astfel nct ctigul total obinut s fie
maxim. Dac nu exist soluii se va afia IMPOSIBIL.

Datre de intrare: din rucsac.in se citesc n Gmax din prima linie apoi, din linia 2 se citesc cele n
greuti iar din linia 3 cele n ctiguri ce se pot obine alegnd cte un obiect obiect.
n rucsac.out se va scrie pe prima linei ctigul maxim obinut sau IMPOSIBIL. Dac se poate,
se vor scrie pe linia a doua, obiectele selectate pentru a obine ctigul maxim, separate prin cte
un spaiu.
1<=n<=100; 1<=Gmax<=300; gi, ci<=100
rucsac.in
rucsac.out
7 100
29
80 10 20 10 100 30 55
1 2 4
8 20 5 1 10 30 20
Algoritm PD:
Etapa 1 - Subproblema: selectarea unor obiecte cu ctig maxim care permit ncrcarea unui
rucsac de capacitate S<=Gmax (suma greutilor obiectelor selectate este S)
Etapa 2 structura de date pentru memorarea soluiilor pariale:
Construim vectorul Cmax(Gmax),
Cmax[S]=ctigul maxim obinut pentru selectarea unor obiecte cu suma greutilor S
Construim matricea caracteristic uz(Gmax+1)(n)
uz[S][i]=1, dac obiectul i a fost selectat n soluia de greutate total S i
uz[S][i]=0, altfel
Etapa 3 - relaia de recuren
Pentru umplerea unui rucsac de capacitate S vom alege un obiect i, daca g[i]<=S. Capacitatea
rmas liber, S-g[i], trebuie incarcata optimal, obtinand castigul maxim Cmax[S-g[i]]
Trebuie sa ne asiguram ca obiectul i nu a mai fost folosit in incarcarea optimala a capacitatii
S-g[i], adica uz[s-g[i]][i]=0.
Recurenta
Cmax[0]=0
Cmax[S]=max{Cmax[S-g[i]]+c[i], daca g[i]<=S si uz[S-g[i]][i]=0}

Probleme propuse
campion.edu.ro/arhiva
barbie
lacusta
codul
tren1
sant
Bibliografie
Cerchez, Emanuela, erban, Marinel, Programarea n Limbajul C/C++ pentru liceu, Ed. Polirom,
Iai, 2005
http://www.campion.edu.ro/arhiva

S-ar putea să vă placă și