Sunteți pe pagina 1din 10

Curs 10-11: Tehnica programarii dinamice

- Introducere
- Principiul tehnicii si etapele aplicarii
- Aplicat ii
- Exercit ii
1 Introducere
Programarea dinamica este o metoda de rezolvare a problemelor bazata pe construirea si utilizarea
unor tabele cu informat ii. La construirea tabelelor pentru completarea unui element se folosesc
elemente completate anterior (construirea se realizeaza n maniera dinamica). Aceasta tehnica se
bazeaza pe descompunerea unei probleme n subprobleme si este adecvata rezolvarii problemelor
(n particular celor de optimizare) care au urmatoarele proprietat i:
Proprietatea de substructura optima. Orice solut ie optima este constituita din solut ii optime
ale subproblemelor. Aceasta proprietatea este specica si problemelor ce pot rezolvate prin
tehnica greedy. Pentru a verica daca o problema poseda aceasta proprietate se poate folosi
metoda reducerii la absurd.
Proprietatea de suprapunere a problemelor. Pentru ca programarea dinamica sa e ecienta
este necesar ca numarul subproblemelor ce trebuie efectiv rezolvate n scopul obt inerii solut iei
problemei init iale sa e relativ mic (polinomial n raport cu dimensiunea problemei). Aceasta
nseamna ca n procesul de descompunere a problemei sa se ajunga de mai multe ori la aceeasi
subproblema care nsa va rezolvata o singura data iar solut ia ei va ret inuta ntr-un tabel.
Ideea descompunerii problemei n subprobleme este folosita si n metoda divizarii nsa n acel
caz era important ca subproblemele sa e independente.
2 Principiul tehnicii si etapele aplicarii
La aplicarea metodei se parcurg urmatoarele etape:
(a) Identicarea structurii unei solut ii optime si a proprietat ilor acesteia prin punerean evident a a
relat iei existente ntre solut ia problemei si solut iile subproblemelor (se verica daca problema
poseda proprietatea de substructura optima).
(b) Stabilirea unei relat ii de recurent a referitoare la criteriul de optimizat sau la valoarea ce
trebuie calculata. Aceasta descrie legatura dintre valoarea criteriului de optim corespunzator
problemei si cele corespunzatoare subproblemelor.
(c) Calculul valorii asociate solut iei optime dezvoltand relat ia de recurent a ntr-o maniera as-
cendenta si ret inand valorile calculate asociate subproblemelor ntr-o structura tabelara.

In
funct ie de problema, n aceasta etapa se pot ret ine si alte informat ii care vor utilizate n
momentul construirii solut iei.
(d) Construirea unei solut ii optime folosind informat iile determinate si ret inute la etapa anterioara.
1
Desi se bazeaza pe descompunerea unei probleme n subprobleme la fel ca tehnica divizarii
specicul programarii dinamice este ca subproblemele nu sunt independente (ci se suprapun).

In
schimb tehnica divizarii conduce la algoritmi ecient i doar daca subproblemele sunt independente.
Dezvoltarea ascendenta si descendenta a unei relat ii de recurent a. Suprapunerea prob-
lemelor face ca obt inerea valorii prin dezvoltarea relat iei de recurent a sa nu e ecienta daca este
abordata n maniera descendenta (top-down) prin implementarea recursiva a relat iei. Aceasta
deoarece o aceeasi valoare poate utilizata de mai multe ori si de ecare data cand este utilizata
este recalculata.
Sa consideram problema determinarii celui de-al m-lea element din sirul lui Fibonacci (f
1
=
f
2
= 1, f
n
= f
n1
+ f
n2
, n 3). O abordare descendenta conduce la algoritmul recursiv:
b rec(m)
IF (m = 1) (m = 2) THEN RETURN 1
ELSE RETURN fib rec(m1) + fib rec(m2)
Numarul de adunari efectuate pentru a determina pe f
m
, T(m) verica relat iile: T(1) = T(2) =
0, T(m) = T(m1) +T(m2) +1. Prin urmare T(m) f
m1
, pentru m 5. Cum f
m

m
/

5
cu = (1 +

5)/2 rezulta ca b rec are complexitate exponent iala.


Consideram acum varianta generarii lui f
m
in maniera ascendenta: se calculeaza si se ret in
valorile lui f
1
, f
2
, . . . f
m
.

In acest caz algoritmul poate descris prin:
b asc(m)
f[1] 1; f[2] 1
FOR i 3, m DO f[i] = f[i 1] + f[i 2]
RETURN f[m]
numarul de adunari efectuate ind de aceasta data T(m) = m2 (complexitate liniara). Aceasta
varianta de implementare introduce utilizarea unui spat iu auxiliar de memorie de dimensiune m.
Algoritmul poate usor transformat astfel ncat sa nu foloseasca decat trei variabile pentru ret inerea
elementelor sirului dar sa ramana cu complexitate liniara:
b asc2(m)
f1 1; f2 1
FOR i 3, m DO f3 f1 + f2; f1 f2; f2 f3
RETURN f3
Un exemplu similar este cel al calculului combinarilor, C
k
n
(n k), pornind de la relat ia de
recurent a:
C
k
n
=
_
1 daca k = 0 sau n = k
C
k
n1
+ C
k1
n1
altfel
(1)
Algoritmul n varianta recursiva:
comb rec(n, k)
IF (k = 0) (n = k) THEN RETURN 1
ELSE RETURN comb rec(n 1, k) + comb rec(n 1, k 1)
are complexitate exponent iala ntrucat T(n, k) 2
min{nk,k}
. Aceasta se poate justica utilizand
arborele de apel si observand ca cea mai scurta ramura din arbore are lungimea minn k, k.

In abordarea ascendenta ideea este sa se ret ina toate valorile C


j
i
calculate pentru 0 j i n.
Aceasta s-ar putea realiza prin completarea elementelor a
ij
din zona inferior triunghiulara a unei
2
matrici n n. De fapt este sucient sa se completeze pana la coloana k. Daca n = k zona
triunghiulara astfel completata este cunoscuta sub denumirea de triunghiul lui Pascal. Algoritmul
poate descris prin:
comb asc(n, k)
FOR i 0, n DO
|FOR j 0, mini, k DO
| |IF (i = j) (j = 0) THEN a[i, j] 1
| |ELSE a[i, j] a[i 1, j] + a[i 1, j 1]
RETURN a[n, k]
Numarul de adunari efectuate, T(n, k) satisface
T(n, k) =
k

i=1
i1

j=1
1 +
n

i=k+1
k

j=1
1 =
k

i=1
(i 1) +
n

i=k+1
k =
k(k 1)
2
+ k(n k)
deci T(n, k) (nk). Se observa ca zona auxiliara utilizata poate redusa, ntrucat pentru
completarea liniei i se folosesc doar valorile din linia i 1.
Exemplu.(Problema determinarii celei mai lungi secvent e strict crescatoare) Se considera un sir
de valori reale a
1
, a
2
, . . . , a
n
si se cauta un subsir a
j
1
, a
j
2
, . . . , a
j
k
cu 1 j
1
< j
2
< . . . < j
k
n,
a
j
1
< a
j
2
< . . . < a
j
k
si astfel ncat k sa e cat mai mare . Un astfel de subsir nu este neaparat unic.
De exemplu pentru sirul (2, 5, 1, 3, 6, 8, 2, 10) exista doua subsiruri strict crescatoare de lungime 6:
(2, 3, 6, 8, 10) si (1, 3, 6, 8, 10). Pe de alta parte nu toate subsirurile de aceeasi lungime se termina
cu acelasi element. De exemplu n sirul (2, 1, 4, 3) exista patru subsiruri crescatoare de lungime
maxima (2): (2, 4), (2, 3), (1, 4), (1, 3).
a) Caracterizarea solut iei optime. Fie a
j
1
< a
j
2
< . . . < a
j
k1
< a
j
k
un subsir de lungime
maxima. Consideram ca a
j
k
= a
i
iar a
j
k1
= a
p
(evident p < i). Prin reducere la absurd se poate
arata ca a
j
1
< a
j
2
< . . . < a
j
k1
este cel mai mare dintre subsirurile crescatoare ale sirului part ial
(a
1
, a
2
, . . . , a
p
) care au proprietatea ca ultimul element este chiar a
p
. Prin urmare problema are
proprietatea de substructura optima si lungimea unui subsir crescator care se termina n a
i
poate
exprimata n funct ie de lungimea subsirurilor crescatoare care se termina cu elemente a
p
ce satisfac
a
p
< a
i
.
b) Stabilirea unei relat ii de recurent a ntre lungimile subsirurilor. Fie (B
i
)
i=1,n
un tablou ce
cont ine pe pozit ia i numarul de elemente al celui mai lung subsir strict crescator al lui a[1..n] care
are pe a[i] ca ultim element (spunem ca subsirul se termina n a[i]). T inand cont de proprietat ile
solut iei optime se poate stabili o relat ie de recurent a pentru B
i
:
B
i
=
_
1 i = 1
1 + maxB
j
[1 j < i si a
j
< a
i
i > 1
Daca mult imea M
i
= B
j
[1 j < i si a
j
< a
i
este vida atunci max M
i
= 0. De exemplu pentru
sirul init ial a = (2, 5, 1, 3, 6, 8, 4) tabloul lungimilor subsirurilor optime care se termina n ecare
element al lui a este: B = (1, 2, 1, 2, 3, 4, 3). Cea mai mare valoare din B indica numarul de elemente
din cel mai lung subsir crescator.
c) Dezvoltarea relat iei de recurent a n maniera ascendenta. Se completeaza un tablou cu ele-
mentele lui (B
i
)
i=1,n
:
3
completare(a[1..n])
B[1] 1
FOR i 2, n DO
|max 0
|FOR j 1, i 1 DO
| |IF (a[j] < a[i]) (max < B[j]) THEN max B[j]
|B[i] max + 1
RETURN B[1..n]
Luand n considerare doar comparat ia dintre doua elemente ale sirului (a[j] < a[i]) costul
algoritmului este T(n) =

n
i=2

i1
j=1
1 =

n
i=2
(i 1) = n(n 1)/2 deci completarea tabelului B
este de complexitate (n
2
).
d) Construirea unei solut ii optime. Se determina cea mai mare valoare din B. Aceasta indica
numarul de elemente ale celui mai lung subsir crescator iar pozit ia pe care se aa indica elementul,
a[m], din sirul init ial cu care se termina subsirul. Pornind de la acest element subsirul se construieste
n ordinea inversa a elementelor sale cautand la ecare etapa un element din sir mai mic decat
ultimul completat n subsir si caruia i corespunde n B o valoare cu 1 mai mica decat cea curenta.
Algoritmul poate descris prin:
construire(a[1..n], B[1..n])
// determinarea valorii si pozit iei maximului n B
imax 1
FOR i 2, n DO
|IF B[imax] < B[i] THEN imax i
m imax
// construirea unei solut ii
k B[m]
x[k] a[m] // ultimul element al subsirului este a[m]
// cat timp lungimea subsirului care se termina n a[m] este mai mare decat 1 se cauta elemente
WHILE B[m] > 1 DO
|i m1 // cautarea ncepe cu elementul imediat anterior
|WHILE (a[i] a[m]) (B[i] ,= B[m] 1) DO
| |i i 1
|m i // elementul a[i] satisface: a[i] < a[m] si B[m] = B[i] + 1
|k k 1 // se adauga un nou element n subsir
|x[k] a[m]
RETURN x[1..k]
Daca dupa completarea elementului a[m] n subsir exista doua subsiruri din a[1..m 1] de
lungime maxima egala cu B[m] 1: unul care se termina n a[p] si unul care se termina n a[q]
(astfel ncat a[p] < a[m] si a[q] < a[m]) algoritmul va selecta ca element pentru subsir pe cel cu
indicele mai apropiat de m, adica mai mare. Astfel daca p < q va selectat q. Aplicand algoritmul
de construire sirului (2, 5, 1, 3, 6, 8, 4) se va porni cu m = 6 (B[m] = 4) ultimul element din subsir
ind astfel 8. Cum B[5] = 3 si 6 < 8 penultimul element va 6. Continuand procesul se selecteaza
n continuare elementele 3 si 1 obt inandu-se subsirul crescator (1, 3, 6, 8) de lungime 4.

Intrucat n ciclul de construire cautarea continua de la pozit ia noului element selectat, chiar
daca sunt doua cicluri WHILE suprapuse ordinul de complexitate este O(n). Cum si determinarea
maximului lui B are acelasi ordin de complexitate rezulta ca algoritmul de construire are complex-
itate liniara.
4
3 Aplicat ii

Inmult irea optimala a unui sir de matrici. Fie A


1
, A
2
, . . ., A
n
un sir de matrici avand
dimensiuni compatibile pentru a putea calcula produsul: A
1
A
2
A
n
. Sa presupunem ca aceste
dimensiuni sunt: (p
0
, p
1
, . . . , p
n
), adica matricea A
i
are p
i1
linii si p
i
coloane. Pentru a calcula
produsul A = A
1
A
2
A
n
trebuie stabilit un mod de grupare a factorilor astfel ncat sa se puna
n evident a ordinea n care vor efectuate nmult irile, la ecare etapa nmult indu-se doua matrici.
Consideram ca produsul a doua matrici se efectueaza dupa metoda clasica astfel ca la produsul
A
i
A
i+1
se efectueaza p
i1
p
i
p
i+1
nmult iri scalare.
Modul de grupare a factorilor (plasarea parantezelor pentru a indica ordinea de efectuare
a nmult irilor) nu inuent eaza rezultatul nal (nmult irea este asociativa) nsa poate inuent a
numarul de operat ii efectuate.
Sa consideram cazul a trei matrici A
1
, A
2
si A
3
avand dimensiunile (2, 20), (20, 5) si (5, 10).

In
acest caz exista doua modalitat i de plasare a parantezelor:
1. A
1
A
2
A
3
= (A
1
A
2
) A
3
.

In acest caz se efectueaza 2 20 5 + 2 5 10 = 300 nmult iri
scalare.
2. A
1
A
2
A
3
= A
1
(A
2
A
3
).

In acest caz se efectueaza 20 5 10 +2 20 10 = 1400 nmult iri
scalare.
Pentru n mare numarul de parantezari (variante de plasare a parantezelor) poate foarte mare
astfel ca este exclusa generarea tuturor parantezarilor posibile si alegerea celei mai bune. Pentru
calculul produsului A
1
A
2
A
n
notand cu K(n) numarul de parantezari posibile obt inem:
K(n) =
_
1 n = 1

n1
i=1
(K(i)K(n i)) n > 1
(2)
ntrucat ultimul nivel de paranteze poate aplicat n oricare dintre pozit iile i 1, 2, . . . , n 1
si ecare dintre cele K(i) parantezari ale produsului A
1
A
i
poate combinata cu ecare dintre
cele K(ni) parantezari ale produsului A
i+1
A
n
. Se poate demonstra prin induct ie matematica
ca K(n) =
C
n1
2(n1)
n
si K(n) (4
n1
/(n 1)
3/2
).
Problema nmult irii optimale a unui sir de matrici (un caz particular al problemelor de plani-
care optimala a prelucrarilor) constan a determina parantezarea (ordinea de efectuare anmult irilor)
care conduce la un numar minim de nmult iri scalare.
Aplicam pentru rezolvarea problemei programarea dinamica.
a) Pentru a specica produsele part iale introducem notat ia A
i..j
= A
i
A
i+1
A
j
. Fie o solut ie
optima caracterizata prin faptul ca parantezele cele mai exterioare sunt plasate pe pozit iile 1, k si
n, adica ultima nmult ire efectuata este: A
1..k
A
k+1..n
. Atunci parantezarile asociate lui A
1..k
si
A
k+1..n
trebuie sa e si ele optime (n caz contrar ar exista o parantezare mai buna pentru A
1..n
).
b) Fie c
ij
numarul de nmult iri scalare efectuate pentru calculul lui A
i..j
. Valorile c
ij
au sens
doar pentru i j iar relat ia de recurent a dedusa din proprietatea de substructura optima este:
c
ij
=
_
0 i = j
min
1k<j
(c
ik
+ c
k+1,j
+ p
i1
p
k
p
j
) i < j
Relat ia se bazeaza pe faptul ca dintre toate parantezarile posibile ale lui A
i..j
se alege cea mai buna
(de cost minim).
5
d) Valorile c[i, j] pot ret inute n port iunea superior triunghiulara a unei matrici. Construirea
n maniera recursiva a matricii este inecienta. Construirea n maniera ascendenta se bazeaza pe
ideea completarii matricii astfel ncat n momentul calculului lui c
ij
toate elementele c
ik
si c
k+1,j
pentru k i, i + 1, . . . , j 1 sa e deja completate. Din acest motiv elementele se completeaza
n ordinea crescatoare a diferent ei j i: prima data se completeza elementele diagonalei principale
(i = j), apoi se completeaza elementele aate imediat deasupra diagonalei principale (j = i + 1)
s.a.m.d.
completare(p[0..n])
FOR i 1, n DO c[i, i] = 0
FOR l 2, n DO
|FOR i 1, n l + 1 DO
| |j i + l 1
| |c[i, j] c[i, i] + c[i + 1, j] + p
i1
p
i
p
j
| |s[i, j] i
| |FOR k i + 1, j 1 DO
| | |cost = c[i, k] + c[k + 1, j] + p
i1
p
k
p
j
| | |IF cost < c[i, j] THEN c[i, j] cost; s[i, j] k
RETURN c[1..n, 1..n], s[1..n, 1..n]
O data cu completarea matricii de costuri se ret ine si pozit ian care se descompune un produs n
doi factori: s[i, j] = k indica faptul ca produsul A
i..j
se descompune n A
i..k
A
k+1..j
. Aceste pozit ii
sunt utile la construirea solut iei. Cum pentru determinarea valorii ecaruia dintre cele n(n 1)/2
elemente este necesara determinarea unui minim dintr-un tablou cu cel mult n elemente rezulta ca
ordinul de complexitate al algoritmului de completare este O(n
3
).
d)

In funct ie de cerint ele problemei se poate determina: (i) numarul minim de operat ii; (ii)
rezultatul nmult irii matricilor; (iii) modul de descompunere a produsului (parantezare).
(i) Numarul minim de nmult iri este chiar c
1n
.
(ii) Calculul produsului poate efectuat n maniera recursiva:
produs optimal(i, j)
IF i = j THEN RETURN A[i]
ELSE
|X produs optimal(i, s[i, j]) // calcul A
i..s[i,j]
|Y produs optimal(s[i, j] + 1, j)// calcul A
s[i,j]..j
|R produs(X, Y ) // produsul a doua matrici

In algoritmul de mai sus s-a presupus ca pot accesate matricile din sir precum si elementele
matricii s.
(iii) Determinarea ordinii n care se efectueaza nmult irile:
parantezare(i, j)
IF i < j THEN
|parantezare(i, s[i, j])
|WRITE s[i, j]
|parantezare(s[i, j] + 1, j)
Problema rucsacului - varianta 0-1. Consideram varianta discreta a problemei rucsacului.
Presupunem ca obiectele se caracterizeaza prin dimensiunile (d
1
, d
2
, . . . , d
n
) si proturile (valorile):
(p
1
, p
2
, . . . , p
n
) iar capacitatea maxima a rucsacului este C. Se pune problema selectarii unui subset
6
de obiecte, ((p
i
1
, d
i
1
), . . . , (p
i
k
, d
i
k
)) care sa nu depaseasca capacitatea rucsacului (

k
j=1
d
i
j
C)
si sa asigure un prot maxim (

k
j=1
p
i
j
este maxima). Se considera ca dimensiunea ecarui obiect
este mai mica decat cea maxima (d
i
C).
Pentru a usura aplicarea tehnicii programarii dinamice vom considera ca (d
i
)
i=1,n
si C sunt
valori naturale.

In varianta 0-1 a problemei un obiect poate selectat doar n ntregime.

In acest
caz tehnica greedy nu garanteaza obt inerea solut iei optimale.
a) Identicarea structurii unei solut ii optime. Problema selectarii dintre cele n obiecte poate
redusa la problema rucsacului corespunzatoare primelor n 1 obiecte si a capacitat ii maxime
1 C
n1
C. O solut ie optima a problemei init iale va constituita dintr-o solut ie optima a
subproblemei corespunzatoare primelor n 1 obiecte la care se adauga eventual al n-lea obiect
(daca C
n1
+ d
n
C). Daca solut ia subproblemei nu ar optima atunci ar putea nlocuita cu
una mai buna ceea ce ar conduce la o solut ie mai buna a problemei init iale.
b) Stabilirea unei relat ii de recurent a. Fie V (i, j) valoarea obiectelor selectate n solut ia optima
a problemei corespunzatoare primelor i obiecte si capacitat ii j. Cum solut ia optima a problemei
corespunzatoare lui i poate exprimata prin solut ia optima a problemei corespunzatoare lui i 1
rezulta urmatoarea relat ie de recurent a pentru V (i, j):
V (i, j) =
_
V (i 1, j) daca j d
i
< 0
maxp
i
+ V (i 1, j d
i
), V (i 1, j) daca j d
i
0
i = 1, n, j = 1, C
cu V (0, j) = 0 pentru j = 0, C iar V (i, 0) = 0 pentru i = 1, n.
Cele doua cazuri din relat ia de recurent a provin din faptul ca o solut ie optima a problemei
asociate primelor i obiecte si capacitat ii j poate sa nu cont ina sau sa cont ina obiectul i.

In primul
caz valoarea este identica cu cea corespunzatoare subproblemei primelor i 1 obiecte, V (i 1, j).

In al doilea caz valoarea este obt inuta adaugand valoarea celui de-al i-lea obiect (p
i
) la valoarea
solut iei problemei corespunzatoare celor i 1 obiecte si capacitat ii j d
i
(capacitatea disponibila
dupa selectarea obiectului i).
V (n, C) reprezinta valoarea maxima a unui set de obiecte a caror dimensiuni nsumate nu
depaseste pe C adica valoarea asociata solut iei optime a problemei.
c) Dezvoltarea relat iei de recurent a. Daca C si (d
i
)
i=1,n
sunt valori ntregi atunci valorile lui
V (i, j) pot ret inute ntr-o matrice cu n + 1 linii si C + 1 coloane. Algoritmul de construire a
tabelului de valori poate descris astfel:
tabel valori(p[1..n],d[1..n],C)
FOR i 0, n DO V [i, 0] = 0
FOR j 1, C DO V [0, j] = 0
FOR i 1, n DO
|FOR j 1, C
| |IF (j < d[i]) THEN V [i, j] = V [i 1, j]
| |ELSE V [i, j] = max(V [i 1, j], p[i] + V [i 1, j d[i]])
RETURN V [0..n, 0..C]
Sa consideram cazul n care n = 5, C = 5, dimensiunile obiectelor sunt (2, 4, 2, 1, 3) iar valorile
asociate (10, 20, 13, 15, 18).

In acest caz matricea de valori este cu 6 linii si 6 coloane (indiciate de
la 0 la 5) si cont ine elementele:
7
_

_
0 0 0 0 0 0
0 0 10 10 10 10
0 0 10 10 20 20
0 0 13 13 23 23
0 15 15 28 28 38
0 15 15 28 38 38
_

_
Pornind de la elementul V [5, 5] se poate construi solut ia astfel. Se observa ca V [5, 5] = V [4, 5].
Aceasta nseamna ca obiectul o
5
nu este selectat.

In schimb V [4, 5] ,= V [3, 5] adica obiectul o
4
este selectat. Aceasta reduce problema la select ia dintre obiectele o
1
, o
2
, o
3
pentru un rucsac de
capacitate 5 d
4
= 4. Valoarea unei solut ii optime a acestei subprobleme este V [3, 4] = 23 (se
observa ca diferent a V [5, 5] V [3, 4] = 38 23 = 15 reprezinta chiar valoarea obiectului o
4
).

In
continuare, se observa ca V [3, 4] ,= V [2, 4] adica obiectul o
3
este selectat. Astfel problema se reduce
la subproblema corespunzatoare setului o
1
, o
2
si capacitat ii 4 d
3
= 2. Valoarea unei solut ii
optime a acestei subprobleme este V [2, 2] = 10. Cum V [2, 2] = V [1, 2] si V [1, 2] ,= 0 rezulta ca
o
2
nu este selectat n schimb este selectat o
1
. Astfel solut ia problemei init iale este o
1
, o
3
, o
4
cu
dimensiunea totala 5 si valoarea totala 38.
d) Construirea solut iei. Pentru construirea solut iei se analizeaza tabelul de valori construit la
etapa anterioara init iind parcurgerea din V [n, C] dupa strategia descrisa n exemplul de mai sus.
Algoritmul poate descris prin:
construire solut ie(V [0..n, 0..C],d[1..n],C)
i n; j C// indicii elementului din V de la care se porneste analiza
k 0 //contor pentru construirea solut iei
WHILE C > 0 // cat timp nu s-a depasit capacitatea rucsacului
|WHILE V [i, j] = V [i 1, j] i 1 DO i i 1
|k k + 1; s[k] = i // adaugarea elementului i la solut ie
|C = C d[i] // capacitatea ramasa disponibila
|i i 1 // noua linie analizata
|j C// noua coloana analizata
RETURN s[1..k]
Tehnica funct iilor de memorie sau a memoizarii. Principalul dezavantaj al abordarii ascen-
dente este faptul ca se bazeaza pe completarea unui ntreg tabel de valori.

In aplicat ii e posibil
ca anumite valori din tabel sa nu e necesare nici n calculul celorlalte valori si nici n construct ia
solut iei (de exemplu elementele V [5, 1], V [5, 2], V [5, 3] si V [5, 4] din tabelul construit pentru prob-
lema rucsacului).
Daca se foloseste abordarea top-down atunci se vor calcula doar valorile asociate subprob-
lemelor care sunt necesare pentru a obt ine valoarea corespunzatoare problemei init iale. Dar daca
o subproblema este ntalnita de mai multe ori atunci ea este rezolvata de ecare data.
O solut ie de compromis care mbina avantajele abordarii ascendente cu a celei descendente este
de a dezvolta relat ia de recurent a ntr-o maniera recursiva ret inand ecare dintre valorile calculate.

In felul acesta daca o valoare deja calculata este necesara din nou ea nu va recalculata ci se va
folosi valoarea ret inuta anterior. Aceasta varianta hibrida este cunoscuta ca tehnica funct iilor de
memorie sau tehnica memoizarii. Aplicarea ei n practica consta n:
init ializarea tabelului cu o valoare virtuala ce va diferita de valorile ce se vor obt ine din
calcule; n felul acesta se va putea verica daca o pozit ie din tabel a fost calculata deja sau
nu;
8
calculul valorii corespunzatoare solut iei n maniera recursiva (cu ret inerea valorilor calculate);
aceasta presupune ca tabelul de valori este o structura globala ce poate accesata la ecare
apel recursiv.
Aplicata la construirea tabelului de valori pentru problema rucsacului aceasta tehnica conduce
la:
init ializare(n,C)
FOR i 1, n DO
|FOR j 1, C DO V [i, j] = 1 // init ializare cu o valoare virtuala
FOR j 0, C DO V [0, j] = 0
FOR i 0, n DO V [i, 0] = 0
RETURN V [0..n, 0..C]
si
calcul valori(i,j)
IF i = 0 j = 0 RETURN 0
IF V [i, j] < 0 // doar valorile ce nu au fost nca determinate se calculeaza
|IF j < d[i] THEN val = calcul valori(i 1, j)
|ELSE val = max(calcul valori(i 1, j), v[i] + calcul valori(i 1, j d[i]))
|V [i, j] = val // ret inerea valorii calculate
RETURN V [i, j]// returnarea valorii preluate din tabel sau calculate
Algoritmul calcul valori are acces la talourile d[1..n] si V [0..n, 0..C]. Apelul calcul valori(n, C)
se plaseaza dupa init ializarea tabloului.
Problema nchiderii tranzitive. Nu doar problemele de optimizare pot rezolvate cu tehnica
programarii dinamice ci si alte probleme a caror solut ie poate exprimata n funct ie de solut iile
unor subprobleme.
Consideram o relat ie binara R 1, . . . , n 1, . . . , n.

Inchiderea sa tranzitiva este o relat ie
binara R

1, . . . , n 1, . . . , n avand proprietatea: daca pentru i, j 1, . . . , n exista


i
1
, . . . , i
m
1, . . . , n cu proprietat ile: (i
1
, i
2
) R, (i
2
, i
3
) R, . . . ,(i
m1
, i
m
) R iar i = i
1
si j = i
m
atunci (i, j) R

.
Pentru a construi R

se considera urmatorul set de relat ii binare R


0
= R, R
1
, . . ., R
n
= R

,
denite astfel: daca pentru i, j 1, . . . , n exista i
1
, . . . , i
m
1, . . . , k cu proprietat ile: (i
1
, i
2
)
R, (i
2
, i
3
) R, . . . ,(i
m1
, i
m
) R iar i = i
1
si j = i
k
atunci (i, j) R
k
. Relat iile pot descrise
prin recurent e astfel: (i, j) R
k
daca (i, j) R
k1
sau (i, k) R
k1
si (k, j) R
k1
.
Pentru a elabora algoritmul de construire a lui R

consideram relat iile binare pe 1, 2, . . . , n


reprezentate prin matrici ale caror elemente sunt denite astfel:
r
ij
=
_
1 daca (i, j) R
0 daca (i, j) , R
Relat iile de recurent a pentru construirea matricilor asociate relat iilor binare R
0
, R
1
, . . . , R
n
sunt:
r
k
ij
=
_
1 daca r
k1
ij
(r
k1
ik
r
k1
kj
)
0 altfel
k = 1, n
cu r
0
ij
= r
ij
. Folosind aceste relat ii de recurent a se poate construi matricea asociata relat iei binare
R
n
, utilizand doar doua matrici auxiliare astfel:
9
nchidere tranzitiva(R[1..n, 1..n])
R2[1..n, 1..n] R[1..n, 1..n]
FOR k 1, n DO
|R1[1..n, 1..n] R2[1..n, 1..n]
|FOR i 1, n DO
| |FOR j 1, n DO
| | |IF (R1[i, j] = 1) (R1[i, k] = 1 R1[k, j] = 1) THEN R2[i, j] = 1
| | |ELSE R2[i, j] = 0
RETURN R2[1..n, 1..n]
Algoritmul pentru determinarea nchiderii tranzitive este cunoscut si sub numele de algoritmul
lui Warshall.
4 Exercit ii
1. Justicat i, folosind arborele de apel, ca algoritmul comb rec are complexitate exponent iala.
2. Propunet i un algoritm de calculare n maniera ascendenta a lui C
k
n
pe baza relat iei de
recurent a (1) folosind cat mai put in spat iu auxiliar.
3. Aplicat i tehnica memoizarii pentru sirul lui Fibonacci si studiat i complexitatea algoritmului
obt inut.
4. Se considera un set de valori naturale nenule A = (a
1
, a
2
, . . . , a
n
). Sa se descompuna A n
doua subseturi B si C astfel ncat sumele elementelor din cele doua subseturi sa e cat mai
apropiate.
Indicat ie. Se reduce la un caz particular al problemei rucsacului: selectia unor obiecte care
sa maximizeze gradul de umplere al unui rucsac avand capacitatea egala cu S =
1
2

n
i=1
a
i
|
(criteriul de optim nu este legat de valorile ci de dimensiunile obiectelor). Obiectele selectate
vor reprezenta subsetul B iar cele neselectate subsetul C. Minimizand diferent a dintre suma
elementelor din B si valoarea S se minimizeaza de fapt modulul diferent ei dintre sumele
elementelor celor doua subseturi.
5. Fie A = (a
1
, a
2
, . . . , a
m
) si B = (b
1
, b
2
, . . . , b
n
) doua siruri de valori. Sa se determine cel
mai lung subsir comun al celor doua siruri, adica (c
1
, c
2
, . . . , c
k
) cu proprietatea ca exista
i
1
< i
2
< . . . < i
k
si j
1
< j
2
< . . . < j
k
astfel ncat b
q
= a
iq
= b
jq
.
Indicat ie. Se noteaza cu T(i, j) numarul de elemente al celui mai lung subsir comun al lui
(a
1
, a
2
, . . . , a
i
) si (b
1
, b
2
, . . . , b
j
) si se foloseste relat ia de recurent a:
T(i, j) =
_

_
0 daca i = 0 sau j = 0
T(i 1, j 1) + 1 daca a
i
= b
j
maxT(i 1, j), T(i, j 1) n celelalte cazuri
10

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