Documente Academic
Documente Profesional
Documente Cultură
Metode Programare
Metode Programare
METODA BACKTRACKING
Este una dintre cele mai cunoscute metode de elaborare a algoritmilor. Ea se aplic[ acelor
probleme @n care solu\ia se poate reprezenta sub forma unui vector x=(x1 ,. . . , xn )∈A1 x. . .xAn , unde Ai ,
i= 1, n sunt finite ( Ai =ni , i= 1, n ). #n plus, pentru fiecare problem[ @n parte este necesar ca solu\ia:
x1 ,...,xn sa satisfac[ anumite condi\ii interne ρ(x1 , . . . , xn ).
Mul\imea A=A1 x. . .xAn este spa\iul solu\iilor posibile. Elementele x∈A care satisfac condi\iile
interne se numesc solu\ii rezultat. Ne propunem determinarea tuturor solu\iilor rezultat, eventual pentru
a alege dintre ele pe cea care minimizeaz[ sau maximizeaz[ o func\ie obiectiv.
Metoda Backtracking evit[ generarea tuturor solu\iilor posibile (toate elementele produsului
cartezian A1 x...xAn ). Elementului xk ∈Ak , k= 1, n i se atribuie o valoare dup[ ce au fost atribuite valori
pentru componentele x1 ∈A1 ,..., xk-1∈Ak-1. Metoda trece la atribuirea unei valori pentru xk+1 ∈Ak+1 doar
dac[ xk @mpreun[ cu x1 ,...,xk-1 verific[ condi\iile de continuare, notate ρk (x1 ,...,xk ). Dac[ condi\iile
ρk (x1 ,...,xk ) sunt @ndeplinite se trece la atribuirea unei valori pentru elementul xk+1 ∈Ak+1 al solu\iei.
Neindeplinirea condi\iilor exprim[ faptul c[ oricum am alege xk+1 ∈Ak+1 ,...,xn ∈An nu vom putea ajunge
la o solu\ie rezultat @n care condi\iile interne s[ fie @ndeplinite. #n acest ultim caz va trebui s[ facem o
alt[ alegere pentru xk , iar acest lucru este posibil doar dac[ nu am epuizat toate valorile posibile din
mul\imea Ak . Dac[ mul\imea Ak a fost epuizat[ va trebui sa mic]or[m pe k, k←k-1 ]i s[ trecem la
alegerea unei alte valori pentru elementul xk-1∈Ak-1.
Backtracking
Intrare: -mul\imile A1 ,...,An
-condi\ia intern[ ρ(x1 , . . . , xn ) pentru solu\ia (x1 ,...,xn )∈A1 ,...,An , exprimat[ prin ρi (x1 ,...,xi ),
i= 1, n , condi\ii la pasul i.
Ie]ire: -solu\iile rezultat (x1 , . . . , xn ).
repeat
v←(„∃ α∈Ak neatribuita inca pentru xk”); w←true
1
if v then
2
xk←α
if not ρ k(x1,…,xk) then w←false endif
endif
until (not v) or (v and w)
v←(v and w)
end posibil
Not[m N={1,...,n} mul\imea celor n coloane ale tablei de ]ah. Vectorul solu\iei rezultat
x=(x1 ,...,xn )∈N×...×N (de n ori) are semnifica\ia:
-componenta i a vectorului (i= 1, n ) reprezint[ linia i de pe tabla de ]ah. Valoarea xi a acestei
componente reprezint[ coloana @n care se a]eaz[ dama de pe linia i.
Ini\ial, toate damele sunt @n afara tablei de ]ah, deci xi =0, i= 1, n .
La pasul k vom @ncerca a]ezarea damei k pe linia k @n coloana x[k]+1. Ini\ial, dama k este @n
afara tablei (x[k]=0∉N). #n general, vom putea a]eza dama @ntr-o alt[ coloan[ dac[ vechea pozi\ie
satisface condi\ia xk <n (1). De fiecare dat[ noua pozi\ie va trebui s[ satisfac[ cond. Interne ρk :
(2) ∀i, 1≤i<k: xi ≠(xk +1) (nu sunt pe aceea]i coloan[), ]i
|i-k|≠|xi-(xk +1)| (nu sunt pe diagonal[)
Dac[ xk <n ]i ρk sunt adevarate, dama de pe linia k se a]eaz[ @n coloana xk +1 ]i se trece la
a]ezarea damei k+1. Astfel, dama k nu poate fi a]ezat[ pe tabla ]i va trebui s[ relu[m a]ezarea damei
k-1. Algoritmul se termin[ c`nd dama 1 nu mai poate fi a]ezat[ pe tabl[ (se @ncearc[ a]ezarea damei @n
coloana 0).
Backtracking recursiv
Algoritmul general backtracking prezentat la @nceputul cursului poate fi scris sub o form[
recursiv[. Astfel, partea principal[ a algoritmului notat[ cu (I) poate fi @nlocuit[ prin apelul unei
proceduri recursive Back (K: integer). Apelul se va face cu Back (1).
procedure Back (k)
k: pasul curent
if (k>0) then
posibil (x, k, sol)
if (not sol) then k←k-1
else
if este sol(k) then tipareste (x1,…,xn)
else
k←k+1, xk←αk, initial
end if
end if
Back (k)
end if
end Back.
#n cazul unor astfel de implement[ri este bine ca procedura Back() s[ nu con\in[ apelul unei alte
proceduri sau func\ii, dec`t apelul Back... Spre exemplu proced. posibil ar trebui @ntocmit[ cu corpul ei.
Algoritmul Greedy-1
Intrare: mul\imea A a elementelor de intrare; |A|=n.
Ie]ire: mul\imea B - solu\ia optim[.
Alege (A,i;x): alege la pasul i din mul\imea A, elementul x. Alegerea se face conform unui
criteriu care, @n final s[ conduc[ la solu\ia optim[.
Posibil (B,x;v): furnizeaz[ @n v∈{true, false} r[spunsul la @ntrebarea: „B∪{x} este sau nu
solu\ie posibil[?”
Adaug (x;B): x adaug[ la B elementul x: B←B∪{x}.
B←Φ
For i=1 to n do
Alege (A, i, X)
Posibil (B, x, v)
if (v) then Adaug (x, B)
end if
repeat
#n aceast[ versiune, criteriul de alegere este aplicat la fiecare pas. Algoritmul poate suferi o
modificare. Vom ordona elementele mul\imii A conform criteriului de alegere stabilit. Urmeaz[ ca apoi
elementele din A s[ fie extrase @n aceast[ ordine.
Algoritmul Greedy-2
Intrare: mul\imea A a elementelor de intrare; |A|=n, A={a1 ,...,an }.
Ie]ire: mul\imea B-solu\ie optim[.
Perm(;A): permut[ elementele lui A ordon`ndu-le conform criteriului de alegere stabilit.
Posibil (B,x,v)
Adaug (x,B)
B←Φ; Perm(A)
For i=1 to n do
Posibil (B, ai, v)
If (v) then Adaug(B, ai)
end if
repeat
maxim[.
Rez. Dac[ ∃ y0 ∈Y cu y0 ≤0, atunci ∑ y≤ ∑ y.
y∈Y y∈Y \{ y 0 }
Deci solu\ia posibil[ Y⊂X este
Y={yσx /y>0}⊂X.
Suma max
Intrare real array X[n]
Ie]ire real array Y[n]
k←0
for i=1 to n do
if (xi>0) then
k←k+1
yk←xi
end if
repeat
Criteriul de alegere: Dac[ am ales textele p1 ,...,pk-1 ]i le-am a]ezat pe band[ @n aceea]i ordine,
atunci cea mai buna alegere pentru textul pk va fi textul cel mai scurt dintre textele {1, 2,..., n} /
{p1 ,...,pk-1}. Astfel suntem condu]i la alegerea textelor @n ordinea cresc[toare a lungimilor lor.
PROPOZI|IE. Fie p=(1, 2, ... , n) permutare dat[ de ordinea cresc. L1 ≤L2 ≤...≤Ln . Atunci
pozi\ionarea @n aceast[ ordine este optim[.
Demonstra\ie. Fie p=(p1 ,...,pn ) o pozi\ionare optim[. Presupunem, prin absurd, c[ ∃ i<j a.@.
Lpi ≥Lpj . Fie p’ ob\inut[ din p schimb`nd pi cu pj . Cele dou[ permut[ri difer[ doar cu dou[ pozi\ii.
Atunci:
ρ(p’)-ρ(p)=(n-i+1)(L pj -Lpi )+(n-j+1)(L pi -Lpj )=(j-i)(L pj -Lpi )≤0
⇒ρ(p’)≤ρ(p) dar ρ(P) este minim[ ⇒ ρ(p’)=ρ(p) ⇒ p’ este pozi\ionare optim[.
Aplic`nd acest ra\ionament de mai multe ori, trecem din permutare @n permutare p`n[ ajungem
la permutarea identic[ p=(1, 2,..., n) dat[ de L1 ≤L2 ≤...≤Ln .
n
f(x)= ∑ ci xi (1)
i =1
Pentru a ajunge la solu\ia optim[ vom considera @n ambele cazuri obiectele @n ordinea
descresc[toare a c`]tigurilor unitare ci /gi , i= 1, n .
Cazul continuu
Presupunem ordinea c1 /g1 ≥c2 /g2 ≥...≥cn /gn ]i vom @ncerca s[ @nc[rc[m pe c`t posibil obiectele @n
@ntregime, In ordinea considerat[, p`n[ c`nd ajungem la greutatea G.
Vect. x=(x1 ,...,xn ) este solu\ie posibil[ dac[ xi ∈[0, 1], i= 1, n
n
∑ gi xi ≤G
i =1
RUCSAC (n, G, g, c, x, C)
n: nr. de obiecte
G: greutatea maxima ce poate fi dusa in rucsac
g: array[1...n] - vectorul greutatilor obiectelor
c: array[1...n] - vect. castigurilor corespunzatoare fiecarui obiect
x: array[1...n] - vect. sol. optime
C: castigul total
C←0, i=1
while (G>0) and (υ≤n)do
if gi<G then xi←1, G←G-gi, C←C+ci, i←i+1
else xi←G/gi, C←C+ci*xi, G←0
for j=i+1 to n do xj←0 repeat
end if
end while
Tipareste (x1,…,xn)
end RUCSAC
Observ[m c[ @n urma procedurii RUCSAC vect. sol. este x=(1,..., 1, xj , 0,..., 0) unde 1≤j≤n, j-
n
unic ]i xj ∈(0, 1]. Avem ∑ gi xi =G.
i =1
Atunci, fie k≤n cel mai mic indice a.@. yk ≠xk (yi =xi , i= 1, k − 1 , yk ≠xk ). Pornind de la solu\ia y vom
construi o nou[ solu\ie optim[ y’ cu propr. y’i =xi , i= 1, n . Repet`nd procedeul p`n[ c`nd k=n vom
ajunge la o solu\ie optim[ care coincide cu x.
Observa\ii:
n n n
1. k≤j. Daca k>j, atunci ∑ gi yi >G ( ∑ gi yi > ∑ gi xi =G) si y nu ar mai fi solu\ia posibil[.
i =1 i =1 i =1
n n
Dac[ k=j, putem presupune yk >xk ⇒ ∑ gi yi > ∑ gi xi =G (fals). ⇒yk <xk .
i =1 i =1
Fie y’=(y1 ,...,yk-1, xk , y’k+1 ,...,y’ n )=(1,…,1,xk , y’k+1 ,…,y’ n ) cu y’i=εyi , i= k + 1, n a.@. greutatea
maxim[ ob\inut[ in cazul lui y s[ fie men\inut[ ]i pentru y’. Not[m
ρ(ε)=[gk xk +ε ∑ gi yi ]-[gk yk + ∑ gi yi ]
i> k i> k
Dar, cum c1 /g1 ≥...≥cn /gn ⇒ g1 /c1 ≤…≤gn /cn ⇒ pentru i>k: gi /ci >gk /ck
#nlocuind gk /ck cu gi /ci ob\inem:
f(y’) – f(y)≥ck /gk [gk (xk -yk )- ∑ gi(yi- yi′)]=ck /gk [(gk xk + ∑ gi yi′)-(gk yk + ∑ gi yi )]=ck /gk ρ(ε)=0
i> k i> k i> k
Procedura RUCSAC 01
RUCSAC 01 (n, G, g, c; x, C)
G1←0, C←0
for i=1 to n do
if (G1+gi<G) then
xi←1
G1←G1+gi, C←C+ci
else xi←0
end if
repeat
Tipareste (x 1,…, xn)
end RUCSAC 01
k −1 k −1
Din algoritmul RUCSAC 01 ⇒ ∀ k=1, n cu xk =0 ⇒ ∑ gi xi ≤ G ]i ∑ gi xi +gk > G
i =1 i =1
Ne propunem s[ ar[t[m c[ vectorul x=(x1 ,..., xn ) ob\inut de algoritmul RUCSAC 01 este solu\ia
optim[.
Fie y=(y1 ,..., yn ) solu\ie optim[. Presupunem y≠x.
Fie k primul indice a.@.: xk ≠yk ⇔ xi =yi , i= 1, k − 1 . Atunci sunt dou[ posibilit[\i:
k −1
1. xk =0 ⇒ ∑ gi xi +gk >G
i =1
k −1
yk =1 ⇒ ∑ gi yi +gk≤G Contradic\ie!!
i =1
n
Pentru c[ ∑ g ky k≤G ⇒ (x k≠yk ) (⇔False) ⇒
k =1
k −1
2. xk =1 ⇒ ∑ gi xi +gk≤G
i =1
k −1
yk =0 ⇒ ∑ gi yi +gk >G Contradic\ie!!
i =1
Metoda ″Divide et impera″ (″desparte ]i st[p`ne]te″) este o alt[ metod[ general[ de elaborare a
algoritmilor. Principiul metodei a fost enun\at de Iulius Cezar. Este o metod[ puternic recursiv[. Ea
const[ @n @mp[r\irea repetat[ a unei probleme de dimensiune mai mare @n dou[ sau mai multe
subprobleme de acela]i tip dar de dimensiuni mai mici. Descompunerea problemelor se repet[ p`n[
c`nd ultimele probleme pot fi rezolvate @n mod simplu. Apoi se merge pe cale invers[ combin`ndu-se
solu\iile de la fiecare pas p`n[ se ob\ine solu\ia problemei.
Altfel spus, fie un vector A={a1 , ... , an } reprezent`nd o mul\ime ale c[rei elemente trebuie
prelucrate conform unei anumite probleme. Presupunem c[ pentru ∀ p, q ∈ {1, ... , n} indici cu p<q ∃
m ∈ {p, p+1, ... , q} astfel @nc`t prelucrarea secven\ei {ap , ... ,aq } se poate face prelucr`nd separat
secven\ele {ap , ap+1 , ... ,am} ]i {am+1 , ... , aq }. Apoi, combin`nd solu\iile se determin[ solu\ia pentru cazul
secven\ei {ap , ... , aq }.
Problema 1: Fiind dat un tablou de elemente @ntregi sau reale A={a1 , ... , an } se cere s[ se
determine valoarea maxim[.
Obs. Problema este pur didactic[ pentru c[ ea are o solu\ie mai simpl[ dec`t cea oferit[ de
metoda ″Divide et impera″.
Rezolvare: Presupunem c[ trebuie s[ g[sim maximul elementelor din secven\a de elemente {ai ,
ai+1 , ... , aj }, i,j∈{1, ... , n} ]i i≤j. Ini\ial vom considera i=1, j=n. Dac[ i=j atunci max=ai . Altfel:
1. se determin[ k=(i+j) div 2
2. se determin[ a=max{ai , ... , ak } ]i b=max{ak+1 , ... , aj }
3. se determin[ max(a, b)
const N=...?
Problema 2: (C[utare binar[). Fiind dat[ o multime de elemente A={a1 , ... , an } ordonat[
(presupunem ordonarea cresc[toare a1 ≤a2 ≤...≤an ) s[ se determine dac[ valoarea c (de acela]i tip cu
elem. din A) se afl[ @n mul\ime.
Rezolvare: Presupunem c[ trebuie s[ r[spundem dac[ c se afl[ @n cadrul secven\ei {ai ,ai+1 ,...,aj },
i,j∈{1, ... ,n}. Ini\ial i=1, j=n.
Dac[ j<i algoritmul se termin[ f[r[ succes. Altfel:
1. se determin[ k=(i+j) div 2
2. dac[ c=ak algoritmul se termin[ cu succes
3. dac[ c≠ak atunci:
- dac[ c<ak atunci c[ut[m pe c @n cadrul secven\ei {ai , ... , ak-1} (j=k-1)
- dac[ c>ak atunci c[ut[m pe c @n cadrul secven\ei {ak+1 , ... , aj } (i=k+1)
procedure caut bin (a: array [1...N] of real; c: real; i,j: integer;
var k: integer); var l integer;
{k=-1 insucces; 1≤k≤n : succes}
begin
if (j<i) then k:=-1
else
begin l:= (i+j) div 2;
if (c=a[l]) then k:=l
else
begin
if (c<a[l]) then cant bin (a, c, i, l-1, k)
else cant bin (a, c, l+1, j, k);
end;
end;
end;
Problema 3: (Problema turnurilor din Hanoi). Se dau trei tije numerotate cu 1, 2, 3 ]i n∈N
discuri perforate ]i de diametre diferite. Ini\ial toate discurile sunt a]ezate pe tija 1 @n ordinea
descresc[toare a diametrelor, consider`nd sensul de la baza tijei spre v`rful ei. S[ se mute toate
discurile pe tija 2 @n acceea]i ordine, folosind tija 3 ca tij[ intermediar[ ]i respect`nd regulile:
-la fiecare pas se mut[ un singur disc din v`rful unei tije.
-pe fiecare tij[, la orice pas, deasupra fiec[rui disc pot apare numai discuri de diametre mai
mici.
Rezolvare: Vom simboliza mutarea unui disc de pe tija i pe tija j , i,j∈{1, 2, 3}, prin perechea
(i, j), i≠j.
n=1 D1 ⇒ (1, 2)
1 2 3
T T T
P1
n=2 p2 p3
D2
D1 D2
T1 T2 T3
Observa\ie: Pentru a putea muta cele dou[ discuri de pe tija i=1 pe tija j=2 am utilizat ca tij[
intermediar[, tija k = 6 - i - j = 6 - 1 - 2 = 3, k = 3.
P1
n=3 p2
D3 p3
D2 D3
D1 D1 D2
T1 T2 T3
Observ[m c[ putem, petru @nceput, s[ facem abstrac\ie de discul D1 ]i s[ @ncerc[m s[ mut[m
n=2 discuri (D2 ]i D3) de pe tija T1 pe tija T3, folosind tija k = 6 - 1 - 3 = 2 ca tij[ intermediar[.
Revenim la discul D1 mut`ndu-l pe tija T2. #n final proced[m din nou ca @n cazul n=2
pentru discurile D2 ]i D3 mut`ndu-le de aceast[ dat[ de pe tija T3 pe tija T2 ]i utiliz`nd tija
k=6-3-2=1 ca tij[ intermediar[.
#n general, dac[ not[m cu H(n, i, j) ]irul mut[rilor necesare pentru a a]eza n discuri (considerate
@n ordinea cresc[toare a diametrelor ]i sens v`rf-baz[ tij[) de pe tija i pe tija j folosind tija k=6-i-j ca
tij[ intermediar[, atunci,
Astfel, reducem problema pentru n discuri la rezolvarea a dou[ probleme pentru n-1 discuri
@ncadr`ndu-ne @n metoda ″Divide et impera″. Vor fi 2n -1 mut[ri.
Pentru n=3 ]irul mut[rilor este:
(1, 2) (1, 3) (2, 3) (1, 2) (3, 1) (3, 2) (1, 2). Sunt 23 -1=7.
atunci, oricare ar fi i, la ]irul de st[ri s0 , s1 , ... , si le corespund acelea]i decizii optime d1 , d2 , ... , di iar la
]irul de st[ri si , si+1 , ... , sn corespund acelea]i decizii optime di+1 , ... , dn .
Dac[ principiul optimalit[\ii este satisf[cut, metoda program[rii dinamice presupune
scrierea unei rela\ii de recuren\[ pentru decizia de la pasul i. #n general rela\iile de recuren\[ sunt de
dou[ tipuri:
• di =f(d1 , d2 , ... , di-1) : procedeul @napoi
• di =f(di+1 , dI+2 , ... , dn ) : procedeul @ninte
Func\ia f determin[ decizia de la pasul i \in`nd seama de trecutul procesului (@n primul caz) sau
de viitorul procesului (@n al doilea caz).
Procedeul @napoi
Problem[. Fie dou[ cuvinte s respectiv t cu m ]i respectiv n litere. S[ se transforme cuv`ntul s
@n cuv`ntul t utiliz`nd opera\iile:
′a′ : ad[ugarea unei litere
′m′ : modificarea unei litere
′s′ : ]tergerea unei litere
Transformarea s[ se fac[ prin utilizarea unui num[r minim de opera\ii. S[ se afi]eze costul
transform[rii (num[rul de opera\ii) ]i cuvintele intermediare.
Rezolvare: O solu\ie banal[, care bine@n\eles nu este optim[, este cea @n care la sf`r]itul
cuv`ntului s se adaug[ literele cuv`ntului t ]i apoi se ]terg primele m litere ale cuv`ntului s, ini\ial. O
alt[ solu\ie, care @n continuare nu este optim[ dar mai bun[ dec`t prima, s-ar aplica @n cazul @n care
m>n. #n acest caz primele n litere din s s-ar modifica prin literele din t ]i apoi s-ar ]terge ultimele m-n
litere.
Vom rezolva problema folosind procedeul @napoi al program[rii dinamice.
Consider[m o matrice cos t (m+1)x(n+1) ale c[rei elemente cos tij au semnifica\ia: (num[rul de
transform[ri) costul transform[rii primelor i caractere ale cuv`ntului s @n primele j caractere ale
cuv`ntului t. #n final ne intereseaz[ cos t (m, n), aceasta fiind valoarea minim[ de opera\ii cerut[ de
problem[.
S[ urm[rim modul de calcul al valorii cos tij :
-dac[ litera de pe pozi\ia i a cuv`ntului s este egal[ cu litera de pe pozi\ia j a cuv`ntului t (si =tj )
atunci cos tij =cos ti-1,j-1 (nu se face nici o opera\ie @n plus fa\[ de pasul anterior).
-dac[ si ≠tj atunci:
1.Transformarea primelor i litere din s @n primele j litere din t poate deriva din transformarea
primelor i-1 litere din s @n primele j-1 litere din t la care se adaug[ oper. de modificare a literei i din s,
si , cu litera j din t, tj .
Atunci: cos tij = cos ti-1, j-1+1 (si ←tj )
2.Transformarea primelor i litere din s @n primele j litere din t poate deriva din transformarea
primelor i-1 litere din s @n primele j litere din t la care se adaug[ opera\ia de ]tergere a literei si (litera
de pe pozi\ia i a cuv`ntului s).
Atunci: cos tij = cos ti-1,j +1 (si se ]terge)
3.Transformarea primelor i litere din s @n primele j litere din t poate deriva din transformarea
primelor i litere din s @n primele j-1 litere din t la care se adaug[ opera\ia de ″ad[ugare″ a unei litere.
Mai precis, la cuv`ntul intermediar ob\inut @n s la pasul anterior, se adaug[ pe pozi\ia j, litera tj .
Atunci: cos tij = cos ti,j-1+1
#n final:
cos ti-1,j-1 dac[ si =tj
cos tij =
1+min{cos ti-1,j-1, cos ti-1,j , cos ti,j-1} altfel
Se observ[ c[ la fiecare pas se alege varianta care conduce la un num[r minim de transform[ri.
Altfel spus, la pasul curent valoarea cos tij este minim[ posibil[.
Pentru realizarea algoritmului vom considera liniile ]i coloanele matricei cos t numerotate
0,...,m respectiv o,...,n.
Coloana o va avea valorile:
cos t0,0 =0 costul transf. cuv. vid @n cuv. vid
cos t1,0 =1 costul transf. cuv. s1 @n cuv. vid (o ]tergere)
-------
cos tm,0 =m costul transf. cuv. s1 ...sm @n cuv. vid (m ]tergeri)
Linia 0 va avea valorile:
cos t0,0 =0
cos t0,1 =1 costul transf. cuv. vid @n cuv. t1 (o ad[ugare)
-------
cos t0,n =n costul transf. cuv. vid @n cuv. t1 ,...,tn (n ad[ugiri)
cos t 6,8 =4 reprezint[ num[rul minim de transform[ri ale cuv`ntului ″corina″ @n cuv`ntul
″cristina″.
S[ urm[rim ]irul de transform[ri.
Observa\ie:
min.
(i-1, j-1) (i-1, j)
(i, j-1) (i, j)
Procedeul @nainte
Problem[: Fie ]irul A=(a1 , ... , an ). S[ se determine cel mai lung sub]ir cresc[tor al lui A,
(ai1 ,ai2 ,...,aik ) unde:
ai1 ≤ai2≤...≤aik , i1 <i2 <...<ik
Rezolvare: Pentru a respecta principiul program[rii dinamice facem urm[toarea presupunere:
-dac[ (ai1 , ... , aik ) este sub]ir cresc[tor de lungime maxim[, atunci ∀ j∈{1, 2, ... , k-1} sub]irul
(aij , aij+1 , ... , aik ) este sub]ir cresc[tor de lungime maxim[ care @ncepe @n aij .
Not[m cu li =nr. elementelor celui mai lung sub]ir cresc[tor care @ncepe cu ai .
Atunci: ln =1
li =1+max{lk / ai <ak , i+1≤k≤n}, i= n − 1,1 .
Procedeul combinat
Aik Ak+1, j
Aij =Ai xAi+1 x...xAj = (A i xAA i+1 x...xA k ) x (A k+1 x...xA j ) unde k este valoarea pentru care se
realizeaz[ minimul de mai sus. Primele dou[ valori din sum[ corespund factorilor (A i x...xAk ) respectiv
(A k+1 x ... x Aj ) iar di .dk+1 .dj+1 este num[rul de @nmul\iri pentru produsul Aik (di , dk+1 ) x
xAk+1, j (dk+1 , dj+1 ).
Formula (1) permite calculul valorilor cost(i, j) @n ordinea descresc[toare a diferen\ei j-i. Pentru
calculul tuturor valorilor cost (i, j) folosim procedura:
Observ[m c[ toate valorile cost(i, j) sunt scrise deasupra diagonalei principale, iar cost(1, n)
reprezint[ cost-ul minim cerut de problem[, adic[ num[rul minim de @nmul\iri @n cazul asocierii
optime.
Asocierea optim[ o vom g[si datorit[ valorilor cost(j, i) @nscrise sub diagonala principal[.
Astfel, pentru i<j, fie k=cost(j, i). Atunci ]tim sigur c[ Ai x...xAj =(A i x...xAk ) x (A k+1 x...xAj ). Vom
continua cu determinarea asocierilor din fiecare parantez[ cercet`nd cost(i, k) ]i cost(k+1, j). Ne vom
opri c`nd cost(i, j)=0, acest lucru desemn`nd un singur factor, matricea Ai (i, j). Formula complet[ a
asocierilor o vom determina @ncep`nd cu cost(n, 1). Iat[ o procedur[ care realizeaz[ acest lucru.
procedure asociere (i, j : longint), i≤j
var k:longint
k=cost(j, i)
if cost(i, k)≠0 then
print (`(`), asociere (i, k), print (`)`)
else print (`A`, i)
end if
print (`x`)
if cost(k+1, j)≠0 then
print (`(`), asociere (k+1, j), print (`)`)
else print (`A`, j)
end if
end asociere
Apel : asociere (1, n)