Dnamkus programozás (Horváth Gyula és Szláv Péter előadása felhasználásával)
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyekkel kfzethető-e F fornt? Megoldás: Tegyük fel, hogy F P P... P...! 2 m m Ekkor F P P P... P..., azaz az adott m 2 m m részproblémának megoldása a megoldás megfelelő részlete. Ezek alapján számoljuk k V(X,) értékeket, ahol V(X,) gaz, ha az X összeg kfzethető az első pénzjeggyel! 26..27. 4:8 2/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyekkel kfzethető-e F fornt? Megoldás: Három esetet vzsgálunk: az összeg megegyezk az -edk pénzjeggyel; az -edk pénzjegyet nem használjuk fel; az -edk pénzjegyet felhasználjuk: V P X, gaz és V X, x és X P és V X P, 26..27. 4:8 3/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyekkel kfzethető-e F fornt? Megoldás: V(X,): V:=X=P() vagy P X, gaz és V X, > és V(X,-) vagy > és X P() és V(X-P(),-) Függvény vége. A megoldás: V(F,N) kszámolása. V x és X P és V X P, Probléma: a futás dő O(2 N ) 26..27. 4:8 4/78
Dnamkus programozás V(X,) kszámításához mely V() értékekre lehet szükség? Az ábra alapján V értéke alulról felfelé, azon belül balról jobbra számolhatók. 26..27. 4:8 5/78
Dnamkus programozás Pénzváltás(Lehet): V(..F,):=hams Ha P() F akkor V(P(),):=gaz Cklus =2-től N-g Cklus X=-től F-g V(X,):=X=P() vagy V(X,-) vagy X P() és V(X-P(),-) Cklus vége Cklus vége Lehet:=V(F,N) Függvény vége. A futás dő O(N*F) Memóragény: N*F 26..27. 4:8 6/78
Dnamkus programozás Memóragény csökkentés: elég egyetlen sort tároln a V mátrxból, és az első feltétel s megtakarítható. Pénzváltás(Lehet): W(..F):=hams; W():=gaz Ha P() F akkor W(P()):=gaz Cklus =2-től N-g Cklus X=F-től -g --esével W(X):=W(X) vagy X P() és W(X-P()) Cklus vége Cklus vége Lehet:=W(F) Függvény vége. A futás dő O(N*F) Memóragény: F 26..27. 4:8 7/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül melyekkel fzethető k F fornt? Megoldás: Legyen V(X,) a legutolsó olyan k ndex, amelyre gaz, hogy P k előfordul X felváltásában! Legyen V(X,)=N+, ha X nem váltható fel az első pénzjeggyel! 26..27. 4:8 8/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül melyekkel fzethető k F fornt? Megoldás: egyébként N N P X V és P X ha N X V ha X V X ha X és ha N X V,,,, 26..27. 4:8 9/78
Dnamkus programozás Pénzváltás: A V mátrx kszámolása. V(..F,):=N+; V(,):= Cklus =-től N-g V(,):= Cklus X=-től F-g Ha V(X,-) N akkor V(X,):=V(X,-) különben ha X P() és V(X-P(),-) N akkor V(X,):= különben V(X,):=N+ Cklus vége Cklus vége V N X, V X, ha V X, ha ha ha X P és V X P, N 26..27. 4:8 N egyébként /78 X N és X
Dnamkus programozás Csak akkor van megoldás, ha V(F,N) N. Ekkor k=v(f,n) olyan pénz ndexe, hogy F-P(k) felváltható az első k- pénzzel. Tehát a V(F-P(k),k-) probléma megoldásával kell folytatnunk, mndaddg, amíg a maradék pénz nem lesz. 26..27. 4:8 /78
Dnamkus programozás Db:=; X:=F; :=N Ha V(F,N) N akkor Cklus :=V(x,) Db:=Db+; A(Db):= X:=X-P() :=- amíg X Cklus vége Eljárás vége. A megoldás előállítása. 26..27. 4:8 2/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül a lehető legkevesebbet használva mennyvel fzethető k F fornt? Megoldás: Tegyük fel, hogy F P P... P... optmáls 2 m m felbontás! Ekkor F P P P... P... m s optmáls, azaz m 2 m az adott részproblémának megoldása a megoldás megfelelő részlete. 26..27. 4:8 3/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül a lehető legkevesebbet használva mennyvel fzethető k F fornt? Megoldás: P X és ha P X O X O P X és ha X O X ha X és ha N X O,,, mn,, 26..27. 4:8 4/78
Dnamkus programozás Pénzváltás(Mnmum): O(..F,):=N+; O(,):= Cklus =-től N-g O(,):= Cklus X=-től F-g Ha X<P() akkor O(X,):=O(X,-) különben O(X,):=mn(O(X,-), +O(X-P(),-)) Cklus vége Cklus vége Eljárás vége. N ha és X ha X O X, O X, ha és X mn O X,, O X P, ha és X 26..27. 4:8 5/78 P P
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül a lehető legkevesebbet használva melyekkel fzethető k F fornt? Megoldás: Tegyük fel, hogy F P P... P... optmáls 2 m m felbontás! Ekkor F P P P... P... m s optmáls, azaz m 2 m az adott részproblémának megoldása a megoldás megfelelő részlete. 26..27. 4:8 6/78
Dnamkus programozás Feladat: Adott P,P 2, P n pénzjegyek közül a lehető legkevesebbet használva melyekkel fzethető k F fornt? Megoldás: egyébként X V P X O X O és P X ha X ha X és ha N X V,, ), (, 26..27. 4:8 7/78
Dnamkus programozás Pénzváltás(O,V): O(..F):=N+; O():=; V(..F,):=N+ Cklus =-től N-g O():=; V(,):= Cklus X=F-től -g --esével Ha X P() akkor S:=O(X-P())+ különben S:=N+ Ha S<O(X) akkor O(X):=S; V(X,):= különben V(X,):=V(X,-) Cklus vége Cklus vége Eljárás vége. N ha és X ha X V X, ha X P és O ( X, ) O X P, V X, egyébként 26..27. 4:8 8/78
Dnamkus programozás Feladat: Két testvér adott értékű ajándékokon osztozkodk. Mnden egyes ajándékot pontosan ez egyk testvérnek kell adn. Készíts testvéres osztozkodást, azaz olyat, amelyben a két testvér által kapott ajándékok értéke különbségének abszolút értéke mnmáls! Megoldás: Ha az ajándékok összértéke E, akkor a feladat megoldása a legnagyobb olyan A E/2 szám, amely érték az ajándékok értékeből kétféleképpen s előállítható. Tehát a megoldás vsszavezethető a pénzváltás probléma megoldására. 26..27. 4:8 9/78
Dnamkus programozás Megoldás: V(X,): V:=X=P() vagy V P X, gaz és V X, > és V(X,-) vagy > és X P() és V(X-P(),-) Függvény vége. A megoldás: a legnagyobb olyan A kválasztása ( és E/2 között), amelyre V(A,N) gaz. x és X P és V X P, Probléma: a futás dő O(2 N ) 26..27. 4:8 2/78
Dnamkus programozás V(X,) kszámításához mely V() értékekre lehet szükség? Az ábra alapján V értéke alulról felfelé, azon belül balról jobbra számolhatók. 26..27. 4:8 2/78
Dnamkus programozás Testvéres osztozkodás(a): V(..E,):=hams Ha P() E akkor V(P(),):=gaz Cklus =2-től N-g Cklus X=-től E-g V(X,):=X=P() vagy V(X,-) vagy X P() és V(X-P(),-) Cklus vége Cklus vége Eredmény megadása(a,v,e,n) Függvény vége. A futás dő O(N*F) Memóragény: N*F 26..27. 4:8 22/78
Dnamkus programozás Eredmény megadása(a,v,e,n): A:=E/2 Cklus amíg nem V(A,N) A:=A- Cklus vége Függvény vége. 26..27. 4:8 23/78
Dnamkus programozás Feladat: Két testvér adott értékű ajándékokon osztozkodk. Mnden egyes ajándékot pontosan ez egyk testvérnek kell adn. Készíts gazságos osztozkodást, azaz olyat, amelyben a két testvér által kapott ajándékok értéke egyforma, a maradék értéke pedg mnmáls! Megoldás: Ha az ajándékok összértéke E, mndkét testvér A értékű ajándékot kap. A feladat megoldása a legnagyobb olyan A E/2 szám, amely érték az ajándékok értékeből kétféleképpen előállítható. Tehát a megoldás vsszavezethető a pénzváltás probléma megoldására. 26..27. 4:8 24/78
Dnamkus programozás Megoldás: Legyen V(X,Y,) gaz, ha az első ajándékból X és Y értékű s előállítható úgy, hogy mndegyk szám legfeljebb az egyk összegben szerepel! Legyen V(,,)=gaz mnden -re, V(X,Y,) hams mnden X,Y-ra! V(X,Y,)-re a következő rekurzív összefüggés írható fel > esetén: V X, Y, gaz V X, Y, P P X Y és és V V X X, Y P, Y, P, 26..27. 4:8 25/78
Dnamkus programozás Megoldás: Legyen V(X,Y,) gaz, ha az első ajándékból X és Y érték s előállítható úgy, hogy mndegyk legfeljebb az egyk összegben szerepel! Legyen V(,,)=gaz mnden -re, V(X,Y,) hams mnden X,Y-ra! V(X,Y,): Ha = akkor V:=hams különben ha X= és Y= akkor V:=gaz különben V:=V(X,Y,-) vagy P()X és V(X-P(),Y,-) vagy P()Y és V(X,Y-P(),-) Függvény vége. A megoldás: a legnagyobb olyan A kválasztása ( és E/2 között), amelyre V(A,A,N) gaz. 26..27. 4:8 26/78
Dnamkus programozás Igazságos osztozkodás(a): V(..E,..E,):=hams; V(,,):=gaz Ha P() E akkor V(P(),,):=gaz V(,P(),):=gaz Cklus =2-től N-g Cklus X=-től E-g Cklus Y=-től E-g V(X,Y,):=V(X,Y,-) vagy P()X és V(X-P(),Y,-) vagy P()Y és V(X,Y-P(),-) Cklus vége Cklus vége Eredmény megadása(a,v,e,n) Függvény vége. 26..27. 4:8 27/78
Dnamkus programozás Eredmény megadása(a,v,e,n): A:=E/2 Cklus amíg nem V(A,A,N) A:=A- Cklus vége Függvény vége. 26..27. 4:8 28/78
Dnamkus programozás Hátzsák feladat Feladat: Adott N tárgy (értékük F, súlyuk S ). Egy hátzsákba maxmum H súlyú tárgyat pakolhatunk. Menny a maxmáls elszállítható érték? Megoldás: Tegyük fel, hogy H S S... S... optmáls megoldás, azaz F F... F 2 m maxmáls! 2 m Ekkor H S S S... S... s optmáls, azaz az m 2 m m adott részproblémának megoldása a megoldás megfelelő részlete. 26..27. 4:8 29/78
Dnamkus programozás Hátzsák feladat Feladat: Adott N tárgy (értékük F, súlyuk S ). Egy hátzsákba maxmum H súlyú tárgyat pakolhatunk. Menny a maxmáls elszállítható érték? Megoldás: Jelölje E(X,) a legnagyobb elszállítható értéket, amely az első tárgyból egy X kapactású hátzsákba bepakolható. E X, max E E F X, X,, F E X S, ha ha ha egyébként és és és S S S X X X 26..27. 4:8 3/78
Dnamkus programozás Hátzsák(): E(..S()-,):=; E(S()..H,):=F() Cklus =2-től N-g Cklus X=-tól H-g E(X,):=E(X,-) Ha S() X és E(X,)<E(X-S(),-)+F() akkor E(X,):=E(X-S(),-)+F() Cklus vége Cklus vége Kírás Eljárás vége. E X, max E E F X, X,, F E X S, ha ha ha egyébként és és és S S S X X X 26..27. 4:8 3/78
Dnamkus programozás Kírás: :=N; X:=H Cklus amíg E(X,)> Cklus amíg és E(X,)=E(X,-) :=- Cklus vége K:, X:=X-S(); :=- Cklus vége Eljárás vége. 26..27. 4:8 32/78
Dnamkus programozás stratégája A dnamkus programozás stratégája. Az [optmáls] megoldás szerkezetének tanulmányozása. 2. Részproblémákra és összetevőkre bontás úgy, hogy: az összetevőktől való függés körmentes legyen; mnden részprobléma [optmáls] megoldása kfejezhető legyen (rekurzívan) az összetevők [optmáls] megoldásaval. 3. Részproblémák [optmáls] megoldásának kfejezése (rekurzívan) az összetevők [optmáls] megoldásaból. 26..27. 4:8 33/78
Dnamkus programozás stratégája 4. Részproblémák [optmáls] megoldásának kszámítása alulról-felfelé haladva: A részproblémák kszámítás sorrendjének meghatározása. Olyan sorba kell rakn a részproblémákat, hogy mnden p részprobléma mnden összetevője (ha van) előbb szerepeljen a felsorolásban, mnt p. A részproblémák kszámítása alulról-felfelé haladva, azaz táblázatktöltéssel. 5. Egy [optmáls] megoldás előállítása a 4. lépésben kszámított (és tárolt) nformácókból. 26..27. 4:8 34/78
Dnamkus programozás leghosszabb közös rész Feladat: Adjuk meg két sorozat X=(x,x 2, x n ) és Y=(y,y 2, y m ) leghosszabb közös részsorozatát! Egy sorozat akkor részsorozata egy másknak, ha abból elemek elhagyásával megkapható. Megoldás: Jelölje XX =(x,x 2, x ) az X, YY j =(y,y 2, y j ) pedg az Y sorozat egy-egy prefxét! Legyen Z=(z,z 2, z k ) egy megoldása a feladatnak! 26..27. 4:8 35/78
Dnamkus programozás leghosszabb közös rész A megoldás elemzése: Ha x n =y m, akkor z k =x n =y m, és ZZ k- az XX n- és YY m- leghosszabb közös részsorozata. Ha x n y m, akkor Z az XX n- és Y vagy az X és YY m- leghosszabb közös részsorozata. Az XX és YY j leghosszabb közös részsorozatának hossza: h, j h, j max h, j, h, j ha ha egyébként x y j vagy j 26..27. 4:8 36/78
Dnamkus programozás leghosszabb közös rész A rekurzív algortmus: Hossz(,j): Ha = vagy j= akkor Hossz:= különben ha X()=Y(j) akkor Hossz:=Hossz(-,j-)+ különben Hossz:=max(Hossz(-,j),Hossz(,j-)) Függvény vége. h max, j h, j h, j, h, j ha ha egyébként x y j vagy j 26..27. 4:8 37/78
Dnamkus programozás leghosszabb közös rész A jó megoldás rekurzó memorzálással: Hossz(,j): Ha H(,j)=- akkor Ha = vagy j= akkor H(,j):= különben ha X()=Y(j) akkor H(,j):=Hossz(-,j-)+ különben H(,j):=max(Hossz(-,j),Hossz(,j-)) Elágazás vége Hossz:=H(,j) Függvény vége. Azaz, amt már egyszer kszámoltunk, azt tároljuk és ne számoljuk k újra! A H mátrxot kezdetben - értékekkel töltjük k! h max, j h, j h, j, h, j ha ha egyébként x y j vagy j 26..27. 4:8 38/78
Dnamkus programozás toronyépítés Feladat: Adott M,M 2, M n méretű kockákból (amelyek súly szernt csökkenő sorrendbe vannak rendezve) építsünk maxmáls magasságú stabl tornyot! A stabl toronyban felfelé haladva a méret és a súly s csökken. Megoldás: Tegyük fel, hogy M ; M ;...; M... megoldás! 2 k k Ekkor n= k- -re M ; M ;...; M... s megoldás, azaz 2 k k az adott részproblémának megoldása a megoldás megfelelő részlete. 26..27. 4:8 39/78
Dnamkus programozás toronyépítés Tehát a feladat a legmagasabb olyan torony magasságának kszámolása, ahol az. kocka van legfelül: Kocka max Kocka Kocka M 2... M M ha ha egyébként M M M M 2 26..27. 4:8 4/78
Dnamkus programozás toronyépítés A rekurzív megoldás: Kocka(): K:=M() Cklus j=-től --g Ha M() M(j) akkor Ha Kocka(j)+M()>K akkor K:=Kocka(j)+M() Cklus vége Kocka:=K Függvény vége. A rengeteg rekurzív hívás matt nagyon lassú. Látható azonban, hogy Kocka() kszámításához csak a korábbakra van szükség. Kocka M ha M M Kocka 2 M ha M M Kocka max... M egyébként 26..27. 4:8 4/78 2
Dnamkus programozás toronyépítés Toronyépítés: Kocka():=M() Cklus =2-től N-g K:=M() Cklus j=-től --g Ha M() M(j) akkor Ha Kocka(j)+M()>K akkor K:=Kocka(j)+M() Cklus vége Kocka():=K Cklus vége Eljárás vége. A táblázatktöltős megoldás. 26..27. 4:8 42/78
Dnamkus programozás toronyépítés Ezzel még nncs kész a megoldás, csak azt tudjuk mnden -re, hogy mekkora a legmagasabb torony, amkor az -edk kocka van felül. A megoldás ezen számok maxmuma. Ha bevezetnénk egy N+., méretű kockát, akkor a megoldás értéke Kocka(N+) lenne. Ha a tornyot fel s kellene építen, akkor még azt s tároln kell, hogy melyk kockát melykre kell rátenn. 26..27. 4:8 43/78
Dnamkus programozás toronyépítés Toronyépítés: Kocka():=M(); Mre():=; M(N+):= Cklus =2-től N+-g K:=M(); Mre():= Cklus j=-től --g Ha M() M(j) akkor Ha Kocka(j)+M()>K akkor K:=Kocka(j)+M(); Mre():=j Cklus vége Kocka():=K Cklus vége Eljárás vége. 26..27. 4:8 44/78
Dnamkus programozás toronyépítés Torony: Toronyépítés Toronykírás(N+) Eljárás vége. Toronykírás(): Ha Mre()> akkor Toronykírás(Mre()) K: Mre() Eljárás vége. 26..27. 4:8 45/78
Dnamkus programozás kemence Feladat: Egy fazekasműhelyben N tárgy vár kégetésre. A kemencébe a beérkezés sorrendjében tehetők be, egyszerre legfeljebb K darab. Mnden tárgynak smerjük a mnmáls égetés dejét, amennyt legalább a kemencében kell töltene. Adjuk meg a mnmáls dőt, am alatt mnden tárgy kégethető! Megoldás: Tegyük fel, hogy ((,, ),, ( m- +,,N)) a megoldás! Ekkor az N. tárgy vagy önmagában kerül a kemencébe, vagy legfeljebb K- előző tárggyal együtt. 26..27. 4:8 46/78
Dnamkus programozás kemence Számítsuk k az első tárgy kégetéséhez szükséges dőt! Id ő mn Id ő Id ő Éget j max Éget j.. ahol j K 26..27. 4:8 47/78
Dnamkus programozás kemence Kemence: Idő():= Cklus =-től N-g H:=Idő(-)+Éget(); max:=éget(); G:= j:=- Cklus amíg j> és +j- K Ha max<éget(j) akkor max:=éget(j) Ha Idő(j-)+max<H akkor H:=Idő(j-)+max; G:=j j:=j- Cklus vége Idő():=H; Db():=-G+ Cklus vége Eljárás vége. Id ő mn Id ő Id ő Éget j max Éget j.. ahol j K 26..27. 4:8 48/78
Dnamkus programozás kemence Feladat: Egy fazekasműhelyben N tárgy vár kégetésre. A kemencébe a beérkezés sorrendjében tehetők be, egyszerre legfeljebb S összsúlyú tárgy tehető. Mnden tárgynak smerjük a mnmáls égetés dejét, amennyt legalább a kemencében kell töltene. Adjuk meg a mnmáls dőt, am alatt mnden tárgy kégethető! 26..27. 4:8 49/78
Dnamkus programozás kemence Megoldás: Tegyük fel, hogy ((,, ),, ( m- +,,N)) a megoldás! Ekkor az N. tárgy vagy önmagában kerül a kemencébe, vagy legfeljebb S súlyú előző tárggyal együtt. Számítsuk k az első tárgy kégetéséhez szükséges dőt! Id ő mn Id ő Id ő Éget j max Éget j.. ahol Súly j.. S 26..27. 4:8 5/78
Dnamkus programozás kemence Kemence: Idő():= Cklus =-től N-g H:=Idő(-)+Éget(); max:=éget(); G:= j:=-; Su:=Súly() Cklus amíg j> és Su+Súly(j) S Ha max<éget(j) akkor max:=éget(j) Su:=Su+Súly(j) Ha Idő(j-)+max<H akkor H:=Idő(j-)+max; G:=j j:=j- Cklus vége Idő():=H; Db():=-G+ Cklus vége Eljárás vége. Éget Id ő Id ő mn Id ő j max Éget j.. 26..27. 4:8 5/78 ahol Súly j.. S
Dnamkus programozás kncs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kncseket, a bal felső sarokból a jobb alsó felé haladva. A terep jobbra és lefelé lejt, azaz a jármű csak jobbra és lefelé haladhat. Add meg, hogy maxmum hány kncset gyűjthet be!! A megoldás elemzése: Ha a megoldás egy L, L 2,,L j,, L k úton érhető el, akkor az L, L 2,,L j egy olyan út, amn elért pontban az odág begyűjthető legtöbb kncset kapjuk. Kezdőpozícó: (,) Végpozícó: (N,M) 26..27. 4:8 52/78
Dnamkus programozás kncs Megoldás: Számítsuk k mnden lehetséges mezőre, hogy addg eljutva menny a maxmálsan begyűjthető kncsek száma! Gy, j max Gy, j, Gy, j ha Kncs, j max Gy, j, Gy, j ha Kncs, j ha " " " " vagy j * * * * * * * * * 26..27. 4:8 53/78
Dnamkus programozás A megoldás: Gy(N,M) kncs Kncsek: Gy(,..M):=-; Gy(..N,):=- Cklus =-től N-g Cklus j=-től M-g Ha Kncs(,j)= * akkor k:= különben k:= Ha Gy(,j-)>Gy(-,j) akkor Gy(,j):=Gy(,j-)+k különben Gy(,j):=Gy(-,j)+k Cklus vége Cklus vége Eljárás vége. Gy max ha vagy, j max Gy, j, Gy, j ha Kncs, j Gy, j, Gy, j ha Kncs, j " " " " 26..27. 4:8 54/78 j
Dnamkus programozás kncs Ha a bejárt útra s szükségünk lenne, akkor a Gy mátrx alapján az út vsszakövethető. Azt kell fgyelnünk, hogy mnden helyre a nagyobb értékű szomszédból kellett jönnünk. Útkírás(,j): Ha vagy j akkor Ha Gy(,j-)>Gy(-,j) akkor Útkírás(,j-); K: J különben Útkírás(-,j); K: L Eljárás vége. A megoldás a számítások után: Útkírás(N,M) 26..27. 4:8 55/78
Dnamkus programozás kncs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kncseket. A terep balról jobbra lejt, azaz a jármű csak jobbra, felfelé és lefelé haladhat. Add meg, hogy maxmum hány kncset gyűjthet be! Mnden mezőre csak egyszer léphetünk! A megoldás elemzése: Ha a megoldás egy L, L 2,,L j,, L k úton érhető el, akkor az L, L 2,,L j egy olyan út, amn elért pontban az odág begyűjthető legtöbb kncset kapjuk, e de jöhetünk lentről s. Kezdőpozícó: (,) Végpozícó: (N,M) 26..27. 4:8 56/78
Dnamkus programozás kncs Megoldás: Számítsuk k mnden lehetséges mezőre, hogy addg eljutva menny a maxmálsan begyűjthető kncsek száma, ha lentről, lletve, ha fentről léptünk be! L, j max L, j, L, j, F, j ha Kncs, j max L, j, L, j, F, j ha Kncs, j ha " " " " vagy j F, j max F, j, L, j, F, j ha Kncs, j max F, j, L, j, F, j ha Kncs, j ha " " " " vagy j 26..27. 4:8 57/78
Dnamkus programozás kncs Kncsek: L(N+,..M):=-; L(..N,):=- F(,..M):=-; F(..N,):=- Cklus j=-től M-g Cklus =-től N-g Ha Kncs(,j)= * akkor k:= különben k:= F(,j):=max(F(-,j),L(,j-),F(,j-))+k Cklus vége Cklus =N-től -g --esével Ha Kncs(,j)= * akkor k:= különben k:= L(,j):=max(L(+,j),L(,j-),F(,j-))+k Cklus vége Cklus vége Eljárás vége. A megoldás: F(N,M) 26..27. 4:8 58/78
Dnamkus programozás kncs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kncseket. A terep jobbra és lefelé lejt, azaz a jármű csak jobbra és lefelé haladhat. Bzonyos helyeken akadályok vannak, ahova nem léphet! Add meg, hogy maxmum hány kncset gyűjthet be!! A megoldás elemzése: Ha a megoldás egy L, L 2,,L j,, L k úton érhető el, akkor az L, L 2,,L j egy olyan út, amn elért pontban az odág begyűjthető legtöbb kncset kapjuk. Kezdőpozícó: (,) Végpozícó: (N,M) 26..27. 4:8 59/78
Dnamkus programozás kncs Megoldás: Számítsuk k mnden lehetséges mezőre, hogy addg eljutva menny a maxmálsan begyűjthető kncsek száma! Gy, j max max N M Gy, j, Gy, j ha Kncs, j Gy, j, Gy, j ha Kncs, j ha ha Kncs, j " " " " " " vagy j * * * + + * * + * * * * + + + * 26..27. 4:8 6/78
Dnamkus programozás kncs Kncsek: Gy(,..M):=; Gy(..N,):= Cklus =-től N-g Cklus j=-től M-g Ha Kncs(,j)= * akkor k:= különben k:= Ha Kncs(,j)= + akkor Gy(,j):=-N*M különben ha Gy(,j-)>Gy(-,j) akkor Gy(,j):=Gy(,j-)+k különben Gy(,j):=Gy(-,j)+k Cklus vége Cklus vége Eljárás vége. A megoldás: Gy(N,M) 26..27. 4:8 6/78
Dnamkus programozás Tükörszó Feladat: Egy szóba mnmálsan hány karaktert kell beszúrn, hogy tükörszó legyen belőle (azaz ugyanaz legyen balról-jobbra és jobbról balra olvasva s)! Megoldás: Tetszőleges S szóra az SS T szó bztos tükörszó, tehát a feladatnak kell legyen megoldása! Alternatív feladat: mnmálsan hány betűt kell töröln? 26..27. 4:8 62/78
Dnamkus programozás Tükörszó Az egybetűs szavak bztosan tükörszavak. Az azonos kezdő- és végbetűjű szavak tükörszóvá alakításához elég a középső rész átalakítása. Ha az első és az utolsó betű különbözk, akkor két lehetőségünk van a tükörszóvá alakításra: az első betűt szúrjuk be a szó végére; az utolsó betűt szúrjuk be a szó elejére. M mn, j M, j, j, M, j Probléma: a rekurzó nem hatékony! M ha ha ha j j j és és S S S S j j 26..27. 4:8 63/78
Dnamkus programozás Tükörszó Jó sorrendű táblázatktöltés kell:, j 26..27. 4:8 64/78
Dnamkus programozás Tükörszó Tükörszó(S,M): M() kezdő feltöltése Cklus j=2-től N-g M(j,j):= Cklus =j--től -g --esével Ha S()=S(j) akkor M(,j):=M(+,j-) különben M(,j):=+Mn(M(+,j),M(,j-)) Cklus vége Cklus vége Tükörszó:=M(,N) Függvény vége. 26..27. 4:8 65/78
Dnamkus programozás Tükörszó Tükörszó(S,T): T():= Cklus j=2-től N-g T(j):=; Ment:= Cklus =j--től -g --esével Ment:=T() Ha S()=S(j) akkor T():=Ment különben T():=+Mn(T(),T(+)) Ment:=Ment Cklus vége Cklus vége Tükörszó:=T() Függvény vége. Mátrx (M) helyett vektor (T) használatával. 26..27. 4:8 66/78
Dnamkus programozás Tükörszó Tükörszó kírása: Ha Tükörszó(S,E) akkor :=; j:=n Cklus amíg <j Ha S()=S(j) akkor :=+; j:=j- különben Ha M(,j)=M(+,j) akkor {S() a j. betű mögé} különben {S(j) az. betű elé} Cklus vége Eljárás vége. 26..27. 4:8 67/78
Dnamkus programozás rúd darabolás Feladat: Egy fémrudat megadott számú darabra kell felvágn úgy, hogy a vágások pontos helyét s tudjuk. A vágások tetszőleges sorrendben elvégezhetőek. Egy vágás költsége megegyezk annak a darabnak a hosszával, amt éppen (két darabra) vágunk. Adjuk meg a vágás műveletsor optmáls összköltségét, és egy olyan vágás sorrendet, amely optmáls költséget eredményez. A megoldás elemzése: Ha az optmáls vágássorozatban először a K. helyen történk a vágás, akkor a V..V k és a V k..v n+ rúd vágássorozata s optmáls lesz. 26..27. 4:8 68/78
Dnamkus programozás rúd darabolás Megoldás: Számítsuk k mnden (,j) rúddarabra, hogy m ennek az optmáls vágás költsége! Opt, j V j V mn Opt j, k Opt k, j k ha ha j j 26..27. 4:8 69/78
Dnamkus programozás rúd darabolás Kncsek: Cklus =-tól N-g Opt(,+):=; S(,+):= Cklus vége Cklus u=2-től N+-g Cklus =-töl N-u+-g j:=+u; Mn:=+ Cklus k=+-től j--g Ha Opt(,k)+Opt(k,j)<Mn akkor Mn:=Opt(,k)+Opt(k,j); Hol:=k Cklus vége Opt(,j):=Mn; S(,j):=Hol Cklus vége Cklus vége Eljárás vége. A megoldás: Opt(,N+) 26..27. 4:8 7/78
Dnamkus programozás stratégája A dnamkus programozás stratégája. Az [optmáls] megoldás szerkezetének tanulmányozása. 2. Részproblémákra és összetevőkre bontás úgy, hogy: az összetevőktől való függés körmentes legyen; mnden részprobléma [optmáls] megoldása kfejezhető legyen (rekurzívan) az összetevők [optmáls] megoldásaval. 3. Részproblémák [optmáls] megoldásának kfejezése (rekurzívan) az összetevők [optmáls] megoldásaból. 26..27. 4:8 7/78
Dnamkus programozás stratégája 4. Részproblémák [optmáls] megoldásának kszámítása alulról-felfelé haladva: A részproblémák kszámítás sorrendjének meghatározása. Olyan sorba kell rakn a részproblémákat, hogy mnden p részprobléma mnden összetevője (ha van) előbb szerepeljen a felsorolásban, mnt p. A részproblémák kszámítása alulról-felfelé haladva, azaz táblázatktöltéssel. 5. Egy [optmáls] megoldás előállítása a 4. lépésben kszámított (és tárolt) nformácókból. 26..27. 4:8 72/78
Dnamkus programozás tovább feladatok DNS A bológa szekvencák, különösen a DNS szekvencák vzsgálata nagyon fontos kutatás terület. Mnden DNS szekvenca leírható olyan karaktersorozattal, amely csak az A, C, G és T karaktereket tartalmazhatja. Számítsd k egy DNS szekvencának egy pontosan K betűből álló részsorozatát, amely a legtöbbször fordul elő a vzsgált szekvencában! 26..27. 4:8 73/78
Dnamkus programozás tovább feladatok LEFED Azt mondjuk, hogy egész számok zárt ntervallumanak egy H halmaza lefed az [,N] ntervallumot, ha az ntervallum mnden x eleméhez van olyan ntervallum H-ban, amelynek x eleme. Egy lefedés költségén a lefedéshez használt ntervallumok hosszanak összegét értjük. Számítsd k, hogy adott [,N] lefedendő ntervallum és lefedéshez használható ntervallumok egy H halmaza esetén mekkora a mnmáls lefedés költsége, ha létezk lefedés! 26..27. 4:8 74/78
Dnamkus programozás tovább feladatok KÉPÁTLÓ Adott egy N x N pxelből álló fekete-fehér kép. Szeretnénk a képen a bal felső saroktól a jobb alsó sarokg egy jobbra-lefele haladó határvonalat húzn úgy, hogy a vonaltól jobbra-felfele eső fekete, valamnt a vonaltól balra-lefele eső fehér pxelek számának K összege a lehető legkevesebb legyen. A határvonalra eső pxelek nem számítanak bele. Add meg a mnmáls lyen K értéket! 26..27. 4:8 75/78
Dnamkus programozás tovább feladatok CSOMAG A csomagküldő szolgálat központjában a beérkezés sorrendjében várakoznak a csomagok továbbításra. Mnden csomagnak smert a súlya. A cégnek két kamonja van, mndegyk azonos K kapactású. Mnden csomag súlya legfeljebb K. A lehető legtöbb csomagot akarják továbbítan a két kamonnal. Kszámítandó az a legnagyobb M szám ( M N), hogy a sorban első M csomag mndegyke felpakolható a két kamon valamelykére! 26..27. 4:8 76/78
Dnamkus programozás tovább feladatok PAKOLÁS Egy raktárból konténereket kell elszállítan K kamonnal. A konténerek egy sorban egymás után helyezkednek el. Mnden konténer súlyát smerjük. Mnden kamonra csak a sorban egymást követő konténerek pakolhatók. Azt szeretnék elérn, hogy a lehető legegyenletesebb legyen a kamonok terhelése, am azt jelent, hogy a maxmálsan terhelt kamon terhelése a lehető legksebb legyen. A kamonok súlykapactása legalább akkora, hogy mndegyk bztosan elbírja a rárakandó konténerek súlyát. Mnden kamonra legalább egy konténert kell rakn. Számíts k egy legegyenletesebb pakolást! 26..27. 4:8 77/78
Dnamkus programozás előadás vége