Dnamkus programozás (Horváth Gyula és Szláv Péter előadása felsználásával)
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyekkel kfzethető-e F fornt? Megoldás: Tegyük fel, hogy F P P... P... m! 1 2 m 1 Ekkor F P P P P......, azaz az adott m 1 2 m 1 1 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, az X összeg kfzethető az első pénzjeggyel!
Dnamkus programozás Feladat: Adott P 1,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 sználjuk fel; az -edk pénzjegyet felsználjuk: V P x X, gaz 1 és V X, 1 1 és X P és V X P, 1
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyekkel kfzethető-e F fornt? Megoldás: V(X,): V:=X=P() vagy X, gaz 1 és V X, 1 >1 és V(X,-1) vagy >1 és X P() és V(X-P(),-1) Függvény vége. A megoldás: V(F,N) kszámolása. V P x 1 és X P és V X P, 1 Probléma: a futás dő O(2 N )
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ámoltók.
Dnamkus programozás Pénzváltás(Lehet): V(1..F,1):=ms Ha P(1) F akkor V(P(1),1):=gaz Cklus =2-től N-g Cklus X=1-től F-g V(X,):=X=P() vagy V(X,-1) vagy X P() és V(X-P(),-1) 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
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íttó. Pénzváltás(Lehet): W(1..F):=ms; W(0):=gaz Ha P(1) F akkor W(P(1)):=gaz Cklus =2-től N-g Cklus X=F-től 1-g -1-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
Dnamkus programozás Feladat: Adott P 1,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+1, X nem válttó fel az első pénzjeggyel!
Dnamkus programozás Feladat: Adott P 1,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 N X V X V X X és N X V 1 1, 1, 1, 0 0 0 0 1,
Dnamkus programozás Pénzváltás: A V mátrx kszámolása. V(1..F,0):=N+1; V(0,0):=0 Cklus =1-től N-g V(0,):=0 Cklus X=1-től F-g Ha V(X,-1) N akkor V(X,):=V(X,-1) különben X P() és V(X-P(),-1) N akkor V(X,):= különben V(X,):=N+1 Cklus vége Cklus vége V N 1 0 X, V X, 1 V X, 1 N 1 egyébként 0 X 0 X P N és és V X 0 X P, 1 N
Dnamkus programozás Csak akkor van megoldás, V(F,N) N. Ekkor k=v(f,n) olyan pénz ndexe, hogy F-P(k) felválttó az első k-1 pénzzel. Tehát a V(F-P(k),k-1) probléma megoldásával kell folytatnunk, mndaddg, amíg a maradék pénz 0 nem lesz.
Dnamkus programozás Db:=0; X:=F; :=N Ha V(F,N) N akkor Cklus :=V(x,) Db:=Db+1; A(Db):= X:=X-P() :=-1 amíg X 0 Cklus vége Eljárás vége. A megoldás előállítása.
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyek közül a lehető legkevesebbet sználva mennyvel fzethető k F fornt? Megoldás: Tegyük fel, hogy F P P P... optmáls m... 1 1 2 felbontás! Ekkor F P P P... P... m s optmáls, azaz m 1 2 m 1 1 az adott részproblémának megoldása a megoldás megfelelő részlete. m
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyek közül a lehető legkevesebbet sználva mennyvel fzethető k F fornt? Megoldás: P X és P X O X O P X és X O X X és N X O 0 1, 1,1, mn 0 1, 0 0 0 0 1,
Dnamkus programozás Pénzváltás(Mnmum): O(1..F,0):=N+1; O(0,0):=0 Cklus =1-től N-g O(0,):=0 Cklus X=1-től F-g Ha X<P() akkor O(X,):=O(X,-1) különben O(X,):=mn(O(X,-1), 1+O(X-P(),-1)) Cklus vége Cklus vége Eljárás vége. O X, mn O N 1 0 OX, 1 X, 1,1 OX P, 1 0 X 0 0 0 és és és X 0 X P X P
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyek közül a lehető legkevesebbet sználva melyekkel fzethető k F fornt? Megoldás: Tegyük fel, hogy F P P P... optmáls m... 1 1 2 felbontás! Ekkor F P P P... P... m s optmáls, azaz m 1 2 m 1 1 az adott részproblémának megoldása a megoldás megfelelő részlete. m
Dnamkus programozás Feladat: Adott P 1,P 2, P n pénzjegyek közül a lehető legkevesebbet sználva melyekkel fzethető k F fornt? Megoldás: egyébként X V P X O X O és P X X X és N X V 1, 1, 1 ), ( 0 0 0 0 1,
Dnamkus programozás Pénzváltás(O,V): O(1..F):=N+1; O(0):=0; V(1..F,0):=N+1 Cklus =1-től N-g O(0):=0; V(0,):=0 Cklus X=F-től 1-g -1-esével Ha X P() akkor S:=O(X-P())+1 különben S:=N+1 Ha S<O(X) akkor O(X):=S; V(X,):= különben V(X,):=V(X,-1) Cklus vége Cklus vége Eljárás vége. V X, V N 1 0 X, 1 egyébként 0 X 0 X P és és X 0 O( X, ) 1 O X P, 1
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íttó. Tehát a megoldás vsszavezethető a pénzváltás probléma megoldására.
Megoldás: V(X,): V:=X=P() vagy Dnamkus programozás V P x X, gaz 1 és V X, 1 >1 és V(X,-1) vagy >1 és X P() és V(X-P(),-1) Függvény vége. A megoldás: a legnagyobb olyan A kválasztása (1 és E/2 között), amelyre V(A,N) gaz. 1 és X P és V X P, 1 Probléma: a futás dő O(2 N )
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ámoltók.
Dnamkus programozás Testvéres osztozkodás(a): V(1..E,1):=ms Ha P(1) E akkor V(P(1),1):=gaz Cklus =2-től N-g Cklus X=1-től E-g V(X,):=X=P() vagy V(X,-1) vagy X P() és V(X-P(),-1) 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
Dnamkus programozás Eredmény megadása(a,v,e,n): A:=E/2 Cklus amíg nem V(A,N) A:=A-1 Cklus vége Függvény vége.
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íttó. Tehát a megoldás vsszavezethető a pénzváltás probléma megoldására.
Dnamkus programozás Megoldás: Legyen V(X,Y,) gaz, az első ajándékból X és Y értékű s előállíttó úgy, hogy mndegyk szám legfeljebb az egyk összegben szerepel! Legyen V(0,0,)=gaz mnden -re, V(X,Y,0) ms mnden X,Y-ra! V(X,Y,)-re a következő rekurzív összefüggés írtó fel >0 esetén: V X,Y, gaz V X,Y, 1 P P X Y és és V X P,Y, 1 V X,Y P, 1
Dnamkus programozás Megoldás: Legyen V(X,Y,) gaz, az első ajándékból X és Y érték s előállíttó úgy, hogy mndegyk legfeljebb az egyk összegben szerepel! Legyen V(0,0,)=gaz mnden -re, V(X,Y,0) ms mnden X,Y-ra! V(X,Y,): Ha =0 akkor V:=ms különben X=0 és Y=0 akkor V:=gaz különben V:=V(X,Y,-1) vagy P()X és V(X-P(),Y,-1) vagy P()Y és V(X,Y-P(),-1) Függvény vége. A megoldás: a legnagyobb olyan A kválasztása (1 és E/2 között), amelyre V(A,A,N) gaz.
Dnamkus programozás Igazságos osztozkodás(a): V(1..E,1..E,1):=ms; V(0,0,1):=gaz Ha P(1) E akkor V(P(1),0,1):=gaz V(0,P(1),1):=gaz Cklus =2-től N-g Cklus X=1-től E-g Cklus Y=1-től E-g V(X,Y,):=V(X,Y,-1) vagy P()X és V(X-P(),Y,-1) vagy P()Y és V(X,Y-P(),-1) Cklus vége Cklus vége Eredmény megadása(a,v,e,n) Függvény vége.
Dnamkus programozás Eredmény megadása(a,v,e,n): A:=E/2 Cklus amíg nem V(A,A,N) A:=A-1 Cklus vége Függvény vége.
Dnamkus programozás Hátzsák feladat... 1 Feladat: Adott N tárgy (értékük F, súlyuk S ). Egy hátzsákba maxmum H súlyú tárgyat pakoltunk. Menny a maxmáls elszállíttó érték? Megoldás: Tegyük fel, hogy H S S S... optmáls meg- m 1 2 oldás, azaz F F... F maxmáls! 1 2 m Ekkor H S S S... S... m s optmáls, azaz az m 1 2 m 1 1 adott részproblémának megoldása a megoldás megfelelő részlete. m
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 pakoltunk. Menny a maxmáls elszállíttó érték? Megoldás: Jelölje E(X,) a legnagyobb elszállíttó értéket, amely az első tárgyból egy X kapactású hátzsákba bepakoltó. E X, max E F 0 EX, 1 X, 1, F EX S, 1 1 egyébként 1 1 1 és és és S S S 1 1 X X X
Dnamkus programozás Hátzsák(): E(0..S(1)-1,1):=0; E(S(1)..H,1):=F(1) Cklus =2-től N-g Cklus X=0-tól H-g E(X,):=E(X,-1) Ha S() X és E(X,)<E(X-S(),-1)+F() akkor E(X,):=E(X-S(),-1)+F() Cklus vége Cklus vége Kírás Eljárás vége. E X, max E F 1 0 EX, 1 X, 1, F EX S, 1 egyébként 1 1 1 és és és S S S 1 1 X X X
Dnamkus programozás Kírás: :=N; X:=H Cklus amíg E(X,)>0 Cklus amíg 1 és E(X,)=E(X,-1) :=-1 Cklus vége K:, X:=X-S(); :=-1 Cklus vége Eljárás vége.
Dnamkus programozás stratégája A dnamkus programozás stratégája 1. 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.
Dnamkus programozás stratégája 4. Részproblémák [optmáls] megoldásának kszámítása alulról-felfelé ladva: A részproblémák kszámítás sorrendjének megtározása. Olyan sorba kell rakn a részproblémákat, hogy mnden p részprobléma mnden összetevője ( van) előbb szerepeljen a felsorolásban, mnt p. A részproblémák kszámítása alulról-felfelé ladva, 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.
Dnamkus programozás leghosszabb közös rész Feladat: Adjuk meg két sorozat X=(x 1,x 2, x n ) és Y=(y 1,y 2, y m ) leghosszabb közös részsorozatát! Egy akkor részsorozata egy másknak, abból elemek elgyásával megkaptó. Megoldás: Jelölje XX =(x 1,x 2, x ) az X, YY j =(y 1,y 2, y j ) pedg az Y sorozat egy-egy prefxét! Legyen Z=(z 1,z 2, z k ) egy megoldása a feladatnak!
Dnamkus programozás leghosszabb közös rész A megoldás elemzése: Ha x m =y m, akkor z k =x m =y m, és ZZ k-1 az XX n-1 és YY m-1 leghosszabb közös részsorozata. Ha x m y m, akkor Z az XX n-1 és Y vagy az X és YY m-1 leghosszabb közös részsorozata. Az XX és YY j leghosszabb közös részsorozatának hossza: h, j h 1, j 1 1 max h 1, j, h, j 1 0 egyébként x 0 y j vagy j 0
Dnamkus programozás leghosszabb közös rész A rekurzív algortmus: Hossz(,j): Ha =0 vagy j=0 akkor Hossz:=0 különben X()=Y(j) akkor Hossz:=Hossz(-1,j-1)+1 különben Hossz:=max(Hossz(-1,j),Hossz(,j-1)) Függvény vége. h, j h 1, j 1 1 max h 1, j, h, j 1 0 egyébként x 0 y j vagy j 0
Dnamkus programozás leghosszabb közös rész A jó megoldás rekurzó memorzálással: Hossz(,j): Ha H(,j)=-1 akkor Ha =0 vagy j=0 akkor H(,j):=0 különben X()=Y(j) akkor H(,j):=Hossz(-1,j-1)+1 különben H(,j):=max(Hossz(-1,j),Hossz(,j-1)) 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 -1 értékekkel töltjük k! h, j h 1, j 1 1 max h 1, j, h, j 1 0 egyébként x 0 y j vagy j 0
Dnamkus programozás toronyépítés Feladat: Adott M 1,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é ladva a méret és a súly s csökken. Megoldás: Tegyük fel, hogy M megoldás! ; M ;...; M... 1 2 k 1 k Ekkor n= k-1 -re M ; M ;...; 1... s megoldás, azaz 1 M 2 k1 k1 az adott részproblémának megoldása a megoldás megfelelő részlete.
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 1 2 Kocka Kocka max... M M M egyébként M M M M 1 2
Dnamkus programozás toronyépítés A rekurzív megoldás: Kocka(): K:=M() Cklus j=1-től -1-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áttó azonban, hogy Kocka() kszámításához csak a korábbakra van szükség. Kocka 1 2 Kocka M Kocka M max... M egyébként M M M M 1 2
Dnamkus programozás toronyépítés Toronyépítés: Kocka(1):=M(1) Cklus =2-től N-g K:=M() Cklus j=1-től -1-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.
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+1., 0 méretű kockát, akkor a megoldás értéke Kocka(N+1) 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.
Dnamkus programozás toronyépítés Toronyépítés: Kocka(1):=M(1); Mre(1):=0; M(N+1):=0 Cklus =2-től N+1-g K:=M(); Mre():=0 Cklus j=1-től -1-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.
Dnamkus programozás toronyépítés Torony: Toronyépítés Toronykírás(N+1) Eljárás vége. Toronykírás(): Ha Mre()>0 akkor Toronykírás(Mre()) K: Mre() Eljárás vége.
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 ((1,, 1 ),, ( m-1 +1,,N)) a megoldás! Ekkor az N. tárgy vagy önmagában kerül a kemencébe, vagy legfeljebb K-1 előző tárggyal együtt.
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ő 1 Éget j 1 max Éget j.. ahol j 1 K
Dnamkus programozás kemence Kemence: Idő(0):=0 Cklus =1-től N-g H:=Idő(-1)+Éget(); max:=éget(); G:= j:=-1 Cklus amíg j>0 és +j-1 K Ha max<éget(j) akkor max:=éget(j) Ha Idő(j-1)+max<H akkor H:=Idő(j-1)+max; G:=j j:=j-1 Cklus vége Idő():=H; Db():=-G+1 Cklus vége Eljárás vége. Idő mn Idő Idő 1 Éget j 1 max Éget j.. ahol j 1 K
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ő!
Dnamkus programozás kemence Megoldás: Tegyük fel, hogy ((1,, 1 ),, ( m-1 +1,,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ő 1 Éget j 1 max Éget j.. ahol Súly j.. S
Dnamkus programozás kemence Kemence: Idő(0):=0 Cklus =1-től N-g H:=Idő(-1)+Éget(); max:=éget(); G:= j:=-1; Su:=Súly() Cklus amíg j>0 és Su+Súly(j) S Ha max<éget(j) akkor max:=éget(j) Su:=Su+Súly(j) Ha Idő(j-1)+max<H akkor H:=Idő(j-1)+max; G:=j j:=j-1 Cklus vége Idő():=H; Db():=-G+1 Cklus vége Eljárás vége. Idő mn Idő Idő 1 Éget j 1 max Éget j.. 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é ladva. A terep jobbra és lefelé lejt, azaz a jármű csak jobbra és lefelé ladt. Add meg, hogy maxmum hány kncset gyűjthet be!! A megoldás elemzése: Ha a megoldás egy L 1, L 2,,L j,, L k úton érhető el, akkor az L 1, L 2,,L j egy olyan út, amn elért pontban az odág begyűjthető legtöbb kncset kapjuk. Kezdőpozícó: (1,1) Végpozícó: (N,M)
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 1, j, Gy, j 1 Kncs, j max Gy 1, j, Gy, j 1 1 Kncs, j 0 * * * * * * * * * 0 "" " " vagy j 0
Dnamkus programozás A megoldás: Gy(N,M) kncs Kncsek: Gy(0,1..M):=0; Gy(1..N,0):=0 Cklus =1-től N-g Cklus j=1-től M-g Ha Kncs(,j)= * akkor k:=1 különben k:=0 Ha Gy(,j-1)>Gy(-1,j) akkor Gy(,j):=Gy(,j-1)+k különben Gy(,j):=Gy(-1,j)+k Cklus vége Cklus vége Eljárás vége. Gy, j max Gy 1, j, Gy, j 1 Kncs, j max Gy 1, j, Gy, j 1 1 Kncs, j 0 0 "" " " vagy j 0
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 1 vagy j 1 akkor Ha Gy(,j-1)>Gy(-1,j) akkor Útkírás(,j-1); K: J különben Útkírás(-1,j); K: L Eljárás vége. A megoldás a számítások után: Útkírás(N,M)
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é ladt. 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 1, L 2,,L j,, L k úton érhető el, akkor az L 1, 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ó: (1,1) Végpozícó: (N,M)
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, lentről, lletve, fentről léptünk be! L F, j max L 1, j, L, j 1, F, j 1 Kncs, j max L 1, j, L, j 1, F, j 1 1 Kncs, j 0 0, j max F 1, j, L, j 1, F, j 1 Kncs, j max F 1, j, L, j 1, F, j 1 1 Kncs, j 0 0 "" " " "" " " vagy vagy j 0 j 0
Dnamkus programozás kncs Kncsek: L(N+1,1..M):=0; L(1..N,0):=0 F(0,1..M):=0; F(1..N,0):=0 Cklus =1-től N-g Cklus j=1-től M-g Ha Kncs(,j)= * akkor k:=1 különben k:=0 L(,j):=max(L(+1,j),L(,j-1),F(,j-1))+k F(,j):=max(F(-1,j),L(,j-1),F(,j-1))+k Cklus vége Cklus vége Eljárás vége. A megoldás: F(N,M)
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é ladt. 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 1, L 2,,L j,, L k úton érhető el, akkor az L 1, L 2,,L j egy olyan út, amn elért pontban az odág begyűjthető legtöbb kncset kapjuk. Kezdőpozícó: (1,1) Végpozícó: (N,M)
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 0 N M Kncs, j Gy 1, j, Gy, j 1 Kncs, j Gy 1, j, Gy, j 1 1 Kncs, j 0 " " "" " " vagy j 0 * * * + + * * + * * * * + + + *
Dnamkus programozás kncs Kncsek: Gy(0,1..M):=0; Gy(1..N,0):=0 Cklus =1-től N-g Cklus j=1-től M-g Ha Kncs(,j)= * akkor k:=1 különben k:=0 Ha Kncs(,j)= + akkor Gy(,j):=-N*M különben Gy(,j-1)>Gy(-1,j) akkor Gy(,j):=Gy(,j-1)+k különben Gy(,j):=Gy(-1,j)+k Cklus vége Cklus vége Eljárás vége. A megoldás: Gy(N,M)
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 feladat-nak kell legyen megoldása! Alternatív feladat: mnmálsan hány betűt kell töröln?
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, j M 1, j 1 1 mn M 1, j, M, j 1 Probléma: a rekurzó nem tékony! 0 j j j és és S S S S j j
Dnamkus programozás Tükörszó Jó sorrendű táblázatktöltés kell: 1, j 1
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):=0 Cklus =j-1-től 1-g -1-esével Ha S()=S(j) akkor M(,j):=M(+1,j-1) különben M(,j):=1+Mn(M(+1,j),T(,j-1)) Cklus vége Cklus vége Tükörszó:=M(1,N) Függvény vége.
Dnamkus programozás Tükörszó Tükörszó(S,T): T(1):=0 Cklus j=2-től N-g T(j):=0; Ment:=0 Cklus =j-1-től 1-g -1-esével Ment:=T() Ha S()=S(j) akkor T():=Ment különben T():=1+Mn(T(),T(+1)) Ment:=Ment Cklus vége Cklus vége Tükörszó:=T(1) Függvény vége. Mátrx helyett vektor sználatával.
Dnamkus programozás Tükörszó Tükörszó kírása: Ha Tükörszó(S,E) akkor :=1; j:=n Cklus amíg <j Ha S()=S(j) akkor :=+1; j:=j-1 különben Ha M(,j)=M(+1,j) akkor {S() a j. betű mögé} különben {S(j) az. betű elé} Cklus vége Eljárás vége.
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 0..V k és a V k..v n+1 rúd vágássorozata s optmáls lesz.
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 0 j1,k Opt k, j k1 j 1 1 j
Dnamkus programozás rúd darabolás Kncsek: Cklus =0-tól N-g Opt(,+1):=0; S(,+1):=0 Cklus vége Cklus u=2-től N+1-g Cklus =0-töl N-u+1-g j:=+u; Mn:=+ Cklus k=+1-től j-1-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(0,N+1)
Dnamkus programozás stratégája A dnamkus programozás stratégája 1. 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.
Dnamkus programozás stratégája 4. Részproblémák [optmáls] megoldásának kszámítása alulról-felfelé ladva: A részproblémák kszámítás sorrendjének megtározása. Olyan sorba kell rakn a részproblémákat, hogy mnden p részprobléma mnden összetevője ( van) előbb szerepeljen a felsorolásban, mnt p. A részproblémák kszámítása alulról-felfelé ladva, 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.
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írtó olyan karaktersorozattal, amely csak az A, C, G és T karaktereket tartalmaztja. 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!
Dnamkus programozás tovább feladatok LEFED Azt mondjuk, hogy egész számok zárt ntervallumanak egy H lmaza lefed az [1,N] ntervallumot, az ntervallum mnden x eleméhez van olyan ntervallum H-ban, amelynek x eleme. Egy lefedés költségén a lefedéshez sznált ntervallumok hosszanak összegét értjük. Számítsd k, hogy adott [1,N] lefedendő ntervallum és lefedéshez sználtó ntervallumok egy H lmaza esetén mekkora a mnmáls lefedés költsége, létezk lefedés!
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 ladó tá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 tárvonalra eső pxelek nem számítanak bele. Add meg a mnmáls lyen K értéket!
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 (1 M N), hogy a sorban első M csomag mndegyke felpakoltó a két kamon valamelykére!
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 pakoltó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!
Dnamkus programozás előadás vége