Sunteți pe pagina 1din 6

Programare dinamic

DINAMIC. TEORIE i APLICAII


Programare
Radu Viinescu, Violeta Viinescu
n acest articol propunem o prezentare a tehnicii programrii dinamice, urmat de o serie de aplicaii cu grad mic de dificultate, care pot fi folosite pentru iniierea elevilor n rezolvarea acestor tipuri de probleme. Folosirea tehnicii programrii dinamice presupune intuiie i abiliti matematice. De multe ori rezolvrile date prin aceast tehnic au ordin de complexitate polinomial. La un nivel superior, toate tehnicile de programare pot fi privite ca particularizri ale programrii dinamice. ne prin combinarea acestor optime pariale. Subproblemele respective se suprapun. La un anumit nivel, dou sau mai multe subprobleme necesit, pentru a fi rezolvate, rezolvarea unei aceeai subprobleme. Pentru a evita risipa de timp rezultat n urma unei implementri recursive, optimele pariale se vor reine treptat, n maniera bottom-up, n anumite structuri de date (tabele). Fie urmtoarea problem: Considerm o reea de orae legate prin osele. Se cere determinarea pentru fiecare pereche de orae A, B a drumului de lungime minim care le unete. Problema se poate aborda folosind metoda programrii dinamice. Dac drumul minim care leag oraele A i B trece prin oraul C, atunci i subdrumurile: A C i C B sunt de lungime minim, afirmaie care poate fi demonstrat folosind metoda reducerii la absurd. Am descompus astfel problema n subprobleme. Mai departe, dac avem drumuri minime de forma A C B1 i A C B2, atunci subproblemele (A, B1) i (A, B2) necesit rezolvarea aceleai subprobleme (A, C). Ca urmare, problema satisface i cel de-al doilea aspect general. A doua variant de prezentare face apel la conceptele intuitive de sistem, stare i decizie. O problem este abordabil folosind tehnica programrii dinamice dac satisface principiul de optimalitate sub una din formele prezentate n continuare. Fie secvena de stri S0, S1, , Sn ale sistemului. Dac d1, d2,, dn este un ir optim de decizii care duc la trecerea sistemului din starea S0 n starea Sn, atunci pentru orice i (1 i n) di+1, di+2 , dn este un ir optim de decizii care duc la trecerea sistemului din starea Si n starea Sn. Astfel, decizia di depinde de deciziile anterioare di+1, dn. Spunem c se aplic metoda nainte. Dac d1, d2,, dn este un ir optim de decizii care duc la trecerea sistemului din starea S0 n starea Sn, atunci pentru orice i (1 i n) d1, d2 , di este un ir optim de decizii care duc la trecerea sistemului din starea S0 n starea Si. Astfel, decizia di+1 depinde de deciziile anterioare

focus

Consideraii teoretice
Tehnica programrii dinamice se aplic problemelor de optim referitor la un anumit criteriu dat n enun. n cele mai multe cazuri soluia care satisface acest optim nu este unic. n literatura de specialitate exist dou variante de prezentare general a acestei tehnici. Prima dintre ele este mai degrab de natur deductiv pe cnd a doua folosete gndirea inductiv. n prima variant apare conceptul de subproblem. Sunt considerate urmtoarele dou aspecte care caracterizeaz o rezolvare prin programare dinamic: Problema se poate descompune recursiv n mai multe subprobleme care sunt caracterizate de optime pariale, iar optimul global se obi-

29

GInfo nr. 15/4 - aprilie 2005

focus

d1, di. Spunem c se aplic metoda napoi. Dac d1, d2,, dn este un ir optim de decizii care duc la trecerea sistemului din starea S0 n starea Sn, atunci pentru orice i (1 i n) di+1, di+2 , dn este un ir optim de decizii care duc la trecerea sistemului din starea Si n starea Sn i d1, d2 , di este un ir optim de decizii care duc la trecerea sistemului din starea S0 n starea Si. Spunem c se aplic metoda mixt. Considerm o a doua problem: Se consider un triunghi format din N linii (1 N 100), fiecare linie coninnd numere ntregi din domeniul {1, 2, ..., 99}. Exemplu
7 3 8 2 4 5 7 2 1 4 6 8 0 4 5

namic presupune gsirea i rezolvarea unui sistem de recurene. n prima variant avem recurene ntre subprobleme, n a doua avem variant recurene n irul de decizii. Deoarece rezolvarea prin recursivitate duce de cele mai multe ori la ordin de complexitate exponenial, se aleg anumite tabele auxiliare pentru reinerea optimelor pariale i spaiul de soluii se parcurge n ordinea cresctoare a dimensiunilor subproblemelor. Folosirea acestor tabele d i numele tehnicii respective. Pentru prima problem folosim o matrice auxiliar COST n care vom calcula costurile minime ntre oricare perechi de orae. Sistemul de recurene este urmtorul: COST(A, B) = D(A, B) pentru C = 0; COST(A, B) = min({COST(A, B), COST(A, C) + COST(C, B) | pentru C = 1, 2, , N}). Pentru a doua problem, triunghiul va fi memorat n matricea A sub diagonal, stnga poziiei (P, Q) va fi (P + 1, Q), iar dreapta va fi (P + 1, Q + 1). Folosim o matrice auxiliar S iar sistemul de recurene va fi: pentru 1 P N S(P, Q) = max{S(P + 1, Q), S(P + 1, Q + 1)} + A(P, Q) pentru P < N, 1 Q P. n afara cazurilor n care recurenele sunt evidente, este necesar i o justificare sau demonstraie a faptului c aceste recurene sunt cele corecte. Pentru cea de-a doua problem rezolvarea este n mod clar corect. Pentru prima vom demonstra valididatea sistemul de recurene: Demonstrm prin inducie c matricea costurilor generate la pasul K conine costurile minime ntre oricare dou orae, pentru acele drumuri care trec numai prin orae intermediare cu etichete mai mici sau egale S(P, N) = A(P, N)

cu K. Propoziia care va fi demonstrat este notat prin PK, Propoziia P0 este evident adevrat. Presupunem c propoziia PK-1 este i ea adevrat. Fie A i B dou orae oarecare; distingem dou cazuri: drumul minim prin primele K orae nu trece prin oraul K; atunci: COST(A, B) COST(A, K) + COST(K, B) i, conform ipotezei de inducie, relaia se verific. drumul minim prin primele K orae trece prin oraul K; atunci trece numai o singur dat prin oraul K i avem: COST(A, B) COST(A, K) + COST(K, B); din definiia recurenelor rezult c i PK este adevrat. De cele mai multe ori, dac pe lng calcularea valorii optime se cere i o secven de decizii care duce la obinerea optimului, se impune folosirea de memorie suplimentar. Pentru a doua problem, dup construirea matricei S, drumul care duce la obinerea sumei maxime poate fi calculat pornind din vrf i cobornd la fiecare pas n direcia la care valoarea respectiv este maxim. Aadar determinarea unui drum optim nu necesit memorie suplimentar. n cazul primei probleme, este util folosirea unei matrice auxiliare de predecesori care se construiete n modul urmtor: Iniial avem PRED(I, J) = I, dac exist drum direct de la I la J sau PRED(I, J) = 0 n caz contrar. La fiecare pas K vom avea PRED (I, J) = PRED(I, J), dac COST(I, J) COST(I, K) + COST(K, J) sau PRED(I, J) = PRED(K, J), dac COST(I, J) > COST(I, K) + COST (K, J). Pentru oraele A i B, un drum de cost minim care le unete va fi dat de valorile succesive: B, PRED(A, B), PRED(A, PRED(A, B)), PRED (A, PRED(A, PRED(A, B))), , A. Acest algoritm este cunoscut n literatura de specialitate drept algoritmul Roy-Floyd.

Determinai cea mai mare sum de numere aflate pe un drum ntre numrul de pe prima linie i unul dintre numerele de pe ultima linie. Succesorii posibili ai unui numr pe acest drum sunt situai sub acesta, o poziie la stnga sau o poziie la dreapta. Sistemul este reprezentat de structura de date corespunzatoare problemei, iar decizia este reprezentat de alegerea de a merge la un anumit pas la stnga sau la dreapta. Problema ndeplinete criteriul de optimalitate n prima sa form: dac suntem pe un nivel k + 1 i am luat toate deciziile de a ajunge n mod optim la toate elementele de pe acest nivel, atunci decizia dk corespunztoare nivelului k se construiete de la stnga la dreapta n modul urmtor: pentru fiecare element x de pe nivelul k se consider cei doi succesori aflai pe nivelul k + 1 deja procesat i este ales acela pentru care suma pn n acel moment este maxim. Indiferent de varianta de prezentare, rezolvarea prin programare di-

GInfo nr. 15/4 - aprilie 2005

30

Aplicaii
n cele ce urmeaz vom prezenta enunurile mai multor probleme i vom arta, pentru fiecare dintre acestea, modul n care pot fi aplicate cunotinele teoretice prezentate. Problema #1 Fie un ir X = (x1, x2, , xn) de lungime N ale crui elemente sunt numere ntregi. Numim subir al irului X o succesiune de elemente din X, n ordinea n care acestea apar n X: Xi1, Xi2, , Xik unde 1 i1 < i2 < < ik N. Se cere determinarea lungimii maxime a unui astfel de subir, cu proprietatea suplimentar de a fi cresctor. De asemenea, trebuie precizat unul dintre aceste iruri cresctoare de lungime maxim. Rezolvare Fie Xi1, Xi2, , Xik o soluie a problemei. n acest caz Xi1, Xi2, , Xik este o subsoluie optim pentru subsecvena care ncepe de la poziia i1, Xi2, Xi3, , Xik este o subsoluie optim pentru subsecvena ce ncepe de la poziia i2 .a.m.d. Afirmaia se poate justifica folosind metoda reducerii la absurd. Se va aplica metoda nainte, determinnd o soluie a fiecrei subprobleme corespunztoare subsecvenei formate din elementele vectorului cuprinse ntre poziiile K i N, pentru 1 K N. Folosim vectorul L, unde LK reprezint lungimea maxim a subsoluiei pentru subsecvena care ncepe la poziia K i opional vectorul SUCC pentru memorarea succesorilor n soluia general a problemei. Sistemul de recurene va fi: LN = 1, SUCCN = 0; pentru 1 K < N: LK = max{LP + 1 | XK XP} pentru P > K sau LK = 1, dac pentru oricare P > K avem XK > XP , SUCCK = un indice P care maximizeaz formula anterioar sau SUCCK = 0, dac LK = 1.

Prezentm versiunea n pseudocod a algoritmului prin care se construiesc vectorii L i SUCC:


LN 1 SUCCN 0 pentru K N - 1, 1 pas -1 execut MAX 1 pentru P K + 1, N execut dac XK XP atunci MAX LP + 1 POZ P sfrit dac LK MAX dac MAX = 1 atunci SUCCK 0 altfel SUCCK POZ sfrit dac sfrit pentru sfrit pentru

lifurile circul numai n sus. O persoan i propune s plece de la nivelul 1 i s ajung la nivelul N, folosind ct mai puine lifturi. Determinai (dac exist) acest numr minim de lifturi precum i un ir posibil de lifturi care respect aceast cerin. irul va fi dat prin numerele de ordine ale lifturilor care l compun. Date de intrare Fiierul de intrare lift.in are urmtoarea structur: pe prima linie se afl numerele N i M, separate printr-un spaiu; pe fiecare dintre urmtoarele M linii se afl perechi de valori Pi, Ui care reprezint nivelurile ntre care circul liftul corespunztor; numrul de ordine al liftului este determinat de poziia n fiier a perechii de niveluri ntre care circul acesta. Date de ieire Fiierul de ieire lift.out trebuie s aib urmtoarea structur: pe prima linie se va afla numrul minim NR al lifturilor sau valoarea -1 dac problema nu are soluie; pe a doua linie, n cazul n care exist soluii, se vor afla numerele de ordine ale unei secvene posibile de lifturi care respect cerina problemei, n ordinea n care persoana folosete aceste lifturi. Restricii i precizri: 1 N 40; 1 M 500. Exemplu
lift.in 5 6 2 5 1 2 1 3 4 5 2 4 3 5 lift.out 2 2 1

focus

Lungimea optim o reprezint valoarea maxim din vectorul L. Dac aceast valoare se afl pe poziia POZ, atunci soluia optim este obinut cu ajutorul vectorului SUCC. Varianta n pseudocod este:
MAX -1 pentru K 1, N execut dac LK > MAX atunci MAX LK POZ K sfrit dac sfrit pentru scrie MAX ct timp POZ 0 execut scrie XPOZ POZ SUCCPOZ sfrit ct timp

GInfo nr. 15/4 - aprilie 2005

Problema se poate rezolva i folosind metoda napoi. n ambele situaii ordinul de complexitate al algoritmului de rezolvare este O(N2). Problema #2 Se consider o cldire cu N niveluri. n interiorul acesteia se afl M lifturi. Fiecare lift Li face legtura ntre nivelul de plecare Pi i nivelul de sosire Ui. Avem ntotdeauna relaia Pi < Ui. Iniial toate lifturile se afl la nivelurile lor de plecare i ntotdeauna

sau
lift.out 2 3 6

31

Problema a fost propus spre rezolvare elevilor din clasele a XI-a i a XII-a la ediia 2005 a Olimpiadei Locale de Informatic din judeul Prahova. Rezolvare Dac L1, L2, LK-2, LK-1, LK este un ir optim de lifturi pentru care avem UL = N, atunci L1, L2, LK-2, LK-1, K este un ir optim pn la nivelul UL K-1 = PL , L1, L2, LK-2 este un ir optim K de lifturi pn la nivelul UL .a.m.d. K-2 Folosim doi vectori auxiliari NR i PRED care memoreaz numrul minim de lifturi, respectiv predecesorul unui lift n irul de lifturi. Prezentm rezolvarea n pseudocod:
NR1 0 PRED1 0 pentru I 2, N execut MIN pentru J 1, I - 1 execut pentru K 1, M execut dac PK = J i UK = I atunci dac MIN > NRJ i NRJ 0 atunci MIN NRJ POZ K sfrit dac sfrit dac sfrit pentru sfrit pentru dac MIN atunci NRI MIN + 1 PREDI POZ altfel NRI -1 PREDI 0 sfrit dac sfrit pentru dac NRN = -1 atunci scrie -1 altfel scrie NRN drum(N) sfrit dac subalgoritm drum(NIV) dac PREDNIV > 0 atunci drum(PREDNIV) scrie PREDNIV sfrit dac sfrit subalgoritm

focus

Algoritmul are ordinul de complexitate O(N2 M) datorit faptului c am memorat proprietile lifturilor sub forma unei liste de perechi. Propunem refacerea algoritmului, memornd lifturile care ajung la etajul I ntr-o list. Ordinul de complexitate ar trebui s devin O(N + M). Problema #3 Se consider un teren denivelat, codificat cu ajutorul unei matrice A, care conine N linii i M coloane, ale crei elemente sunt numere naturale. Se numete drum Est-Sud o succesiune de celule ale matricei care ndeplinesc condiia ca, la fiecare pas, dup o celul de coordonate (I, J) s urmeze fie celula dinspre Est (I + 1, J), fie celula dinspre Sud (I, J + 1). Determinai un drum Est-Sud de lungime maxim avnd n plus proprietatea c valorile situate n celulele sale sunt n ordine cresctoare. Date de intrare Fiierul de intrare drum.in are urmtoarea structur: pe prima linie se afl valorile N i M, separate printr-un spaiu; pe urmtoarele N linii, se afl valorile corespunztoare ale matricei, cte M numere pe o linie, separate ntre ele prin cte un spaiu. Date de ieire Fiierul de ieire drum.out trebuie s aib urmtoarea structur: pe prima linie valoarea L, lungimea maxim a drumului. pe urmtoarele L linii, perechi I, J de coordonate care identific celulele care alctuiesc drumul. Restricii i precizari: 1 N; M 100; 0 AIJ 1000 Exemplu
drum.in 4 4 1 20 3 10 4 5 6 6 1 7 3 1

drum.out 5 1 1 2 1 2 2 2 3 3 4

Rezolvare: Dac (I1, J1), (I2, J2), (I3, J3), , (IK, JK) este un drum de lungime maxim care pornete de la celula (I1, J1), atunci (I2, J2), (I3, J3), , (IK, JK) este un drum de lungime maxim care pornete de la celula ((I2, J2), drumul (I3, J3), , (IK, JK) este un drum de lungime maxim care pornete de la celula (I3, J3) .a.m.d. Folosim dou matrice auxiliare L i LEG, care vor pstra informaiile necesare determinrii drumului. Valoarea LIJ reprezint lungimea maxim a unui drum care pornete din celula de coordonate I i J, iar LEGIJ poate avea una dintre valorile 0 , 1 sau 2. Valoarea 0 indic faptul c urmtoarea celul care face parte din drum este nspre Sud, valoarea 1 indic faptul c urmtoarea celul care face parte din drum este nspre Est, iar valoarea 2 indic faptul c celula corespunztoare este ultima celul a drumului. Algoritmul descris n pseudocod este:
pentru I 1, N execut LIM 1 LEGIM 2 sfrit pentru pentru J 1, M execut LNJ 1 LEGNJ 2 sfrit pentru pentru I N - 1, 1 pas -1 execut pentru J M - 1, 1 pas -1 execut dac AIJ AI+1,J atunci L1 LI+1,J+1 altfel L1 0 sfrit dac dac AIJ AI,J+1 atunci L2 LI,J+1+1

GInfo nr. 15/4 - aprilie 2005

32

altfel L2 0 sfrit dac dac L1 > L2 atunci DIR 0 L0 L1 altfel DIR 1 L0 L2 sfrit dac dac L0 = 0 atunci LIJ 1 LEGIJ 2 altfel LIJ L0 LEGIJ DIR sfrit dac sfrit pentru sfrit pentru X0 Y0 MAX 0 pentru I 1, N execut pentru J 1, M execut dac LIJ > MAX atunci MAX LIJ XI YJ sfrit dac sfrit pentru sfrit pentru scrie MAX IX JY ct timp (LEGIJ 2) execut scrie I, J dac LEGIJ = 0 atunci II+1 altfel JJ+1 sfrit dac sfrit ct timp scrie I, J

Y1, X2, Y2 cu semnificaia c piesa situat n punctul de coordonate (X1, Y1) se poate muta n punctul de coordonate (X2, Y2); n plus de fiecare dat avem relaia: X1 < X2 (piesele avanseaz spre ultima linie a tablei). S se determine numrul secvenelor posibile de mutri pe care le poate efectua o pies plecnd de la un punct situat pe prima linie i ajungnd la un punct situat pe ultima linie a tablei. Date de intrare Fiierul de intrare mutari.in are urmtoarea structur: pe prima linie se afl numerele N, M, K care indic numrul de linii ale tablei, numrul de coloane ale tablei, respectiv numrul de elemente ale listei de mutri; cele trei numere sunt separate prin cte un spaiu; pe urmtoarele K linii se afl cvadruple de forma X1, Y1, X2, Y2 care indic o mutare posibil; cele patru numere sunt separate prin spaii. Date de ieire Fiierul de ieire mutari.out trebuie s aib urmtoarea structur: o singur linie pe care se va afla numrul NR, indicnd numrul secvenelor posibile de mutri. Exemplu
mutari.in 5 9 15 1 2 3 1 1 2 2 3 2 3 3 3 3 1 5 1 3 1 4 3 4 3 5 3 2 3 4 6 3 3 5 5 4 3 5 5 1 5 3 6 3 6 4 6 4 6 5 5 1 9 2 8 2 9 4 9 4 8 5 9 mutari.out 6

Restricii si precizri: 1 N; M 200; 1 K 1000. Problema a fost propus spre rezolvare elevilor din clasa a X-a la ediia 2005 a Olimpiadei Locale de Informatic din judeul Prahova. Rezolvare Problema poate fi considerat o generalizare a problemei determinrii numrului de modalitai de a urca o scar cu N trepte, la fiecare pas urcndu-se una sau dou trepte. Folosim vectorii XP, YP, XF, YF pentru memorarea extremitilor arcelor (aceste arce reprezint mutrile posibile) i o matrice auxiliar A cu N linii i M coloane. Prezentm n continuare rezolvarea n pseudocod: sorteaz cresctor vectorii XP, YP, XF, YF n funcie de valorile vectorului
XP

focus
GInfo nr. 15/4 - aprilie 2005

iniializeaz cu 0 toate elementele matricei A pentru J 1, K execut


dac XPJ = 1 atunci A1,YP 1 J sfrit dac sfrit pentru pentru J 1, K execut AXF ,YF AXF ,YF + AXP ,YP J J J J J J sfrit pentru S0 pentru J 1, M execut S S + ANJ sfrit pentru scrie s

Algoritmul are ordinul de complexitate O(N M). Problema #4 Considerm o tabl de joc de form dreptunghiular avnd N linii i M coloane. Piesele jocului se mic ncepnd de la o poziie iniial aflat pe prima linie pn la o poziie final aflat pe ultima linie a tablei. Este dat o list de mutri posibile sub forma unor cvadruple: X1,

Algoritmul are ordinul de complexitate O(K log K + N M). Datorit existenei relaiilor de recuren i a rezolvrii lor n modul bottomup putem spune c problema se ncadreaz n tehnica programrii dinamice.

33

Problema #5 Fie X = (X1, X2, , Xn) i Y = (Y1, Y2, , Ym) dou iruri care conin n, respectiv m numere ntregi. Determinai un subir comun al acestor iruri, care are lungimea maxim. Exemplu

focus

X = (2,7,7,6,2,8,4,1,3,5,6) Y = (10,2,5,6,7,7,4,3,5,8)

O soluie este:
Z = (2,7,7,4,3,5)

Rezolvare Fie Z = (Z1, Z2, , Zk-1, Zk) un astfel de subir. Exist o pereche (i, j) pentru care avem Zk = Xi i Zk = Yj. n acest caz Z este optim pentru subsecvenele X1,, Xi i Y1, , Yj. De asemenea, exist o pereche (i', j') pentru care avem Zk-1 = Xi' i Zk-1 = Yj'. Mai mult, vom avea ntotdeauna i' < i i i' < i. n acest caz Z1, , Zk-1 este optim pentru subsecvenele X1, , Xi' i Y1, , Yj'. Se aplic metoda napoi; trebuie s ajungem pas cu pas de la perechea (i', j') la perechea (i, j). Considerm toate subsecvenele de forma X1,, Xi i Y1, , Yj. Reinem pentru o pereche de indici (i, j) valoarea Aij care indic lungimea maxim a unui subir comun al irurilor X1,, Xi i Y1, , Yj. Pentru i = 0 sau j = 0 vom avea ntotdeauna A0k = Ah0=0, pentru toate valorile k i h pentru care 1 k m i 1 h n. Pe cazul general, dac Xi = Yj, atunci Zk = Xi = Yj i Aij = Ai-1,j-1 + 1, deoarece i' < i - 1 si j' < j - 1. Dac Xi Yj trebuie s eliminm unul dintre capete. S-ar putea s avem Xi = Yj-1 sau Yj = Xi-1 (este posibil ca ambele egaliti s fie adevrate simultan). n general, putem considera c Aij = max(Ai,j-1, Ai,j-1). Se observ c matricea A se poate construi n urma unei parcurgeri pe linii i coloane. Prezentm n continuare rezolvarea n pseudocod:
pentru i 1, n execut Ai0 0 sfrit pentru

pentru j 1, m execut A0j 0 sfrit pentru pentru i 1, n execut pentru j 1, m execut dac Xi = Yj atunci Aij Ai-1,j-1 + 1 altfel dac Ai-1,j > Ai,j-1 atunci Aij Ai-1,j altfel Aij Ai,j-1 sfrit dac sfrit dac sfrit pentru sfrit pentru

Exemplu V1 = {1}, V2 = {2, 3, 4, 5}, V3 = {6, 7, 8}, V4 = {9, 10, 11}, V5 = {12}. Arce: (1, 2) cost 9; (1, 3) cost 7; (1, 4) cost 3; (1, 5) cost 2; (2, 6) cost 4; (2, 7) cost 2; (2, 8) cost 1; (3, 6) cost 2; (3, 7) cost 7; (4, 8) cost 11; (5, 7) cost 11; (5, 8) cost 8; (6, 9) cost 6; (6, 10) cost 5; (7, 9) cost 4; (7, 10) cost 3; (8, 10) cost 5; (8, 11) cost 6; (9, 12) cost 4; (10,12) cost 2; (11,12) cost 5. Un drum de cost minim este: 1, 2, 7, 10, 12 i are costul 16. Rezolvare Se aplic metoda nainte. Relaia de recurena este: costnivel, J = min{cJL + costnivel+1, L} pentru L n Vnivel+1 i (J, L) arc. Algoritmul de determinare a costului minim, n pseudocod, este:
costN 0 pentru J N - 1, 1 pas -1 execut

Subirul propriu-zis se construiete tot pe baza matricei A. Se parcurge un drum de la punctul de coordonate (n, m) ctre marginile din stnga i de sus ale matricei. La fiecare pas, dac Xi = Yj se reine aceast valoare, altfel se merge ctre maximul coordonatelor precedente (I - 1, J) i (I, J - 1). Prezentm rezolvarea n pseudocod:
in jm ct timp i > 0 i j > 0 execut dac Xi = Yj atunci scrie Xi II-1 JJ-1 altfel dac Ai-1,j = Aij atunci ii-1 altfel jj-1 sfrit dac sfrit dac sfrit ct timp

parcurgem lista de adiacent a nodului J fie K nodul pentru care valoarea cJK + costK este minim cost[J] cJK + costK d[J] K
sfrit pentru

Pentru determinarea drumului de cost minim putem utiliza algoritmul:


drum1 1 drumH N pentru J 2, H - 1 execut drumJ ddrum J-1 sfrit pentru

GInfo nr. 15/4 - aprilie 2005

34

Problema #6 Un graf orientat pe niveluri are nodurile mprite n k 2 mulimi V1, V2, , Vk. n prima mulime se afl nodul surs s, n ultima mulime se afl nodul terminal t. Arcele unesc noduri din mulimi succesive i au costuri pozitive. Se dorete determinarea unui drum de cost minim de la surs la destinaie.

Ordinul de complexitate al algoritmului este O(N + M) dac memorm graful prin liste de adiacen. Algoritmul se poate generaliza pentru arce ntre mai multe niveluri.

Bibliografie
1. Ellis Horowitz, Sartaj Sahni, Sanguthevar Rajasekaran, Computer Algorithms, Computer Science Press 1998. 2. Emanuela Cerchez, Informatic, Editura Polirom, 2002 3. ***, probleme propuse la concursurile de programare.

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