Dynamcé programovane 4.. Úvod do dynamcého programovana (Dynamc programmng) Prncíp rozdeľuj-a-panuj (dvde-and-conquer), torý sa používa pr mnohých problémoch, pracuje nasledovne: veľý problém rozdelíme na vaceré samostatné menše podproblémy, toré vyrešme a výsledy použjeme (sombnujeme) na vytvorene rešena celého veľého problému. V dynamcom programovaní tento prncíp dovedeme do etrému: eď presne neveme, toré podproblémy treba vyrešť, jednoducho ch vyrešme všety, výsledy s zapamätáme a opäť využjeme na dorešene väčších problémov. 4... Kedy použť dynamcé programovane? Pr aplovaní dynamcého programovane musíme počítať s netorým úsalam. Po prvé, ne vždy je možné sombnovať rešena menších problémov na vytvorene rešena väčšeho problému a po druhé, počet malých problémov, toré potrebujeme vyrešť môže byť prílš veľý. edá sa precízne vyčlenť, toré problémy sa dajú vhodne tato rešť, ale sú určté uazovatele, toré nám pomáhajú: Optmálna podštrutúra Prelínajúce sa podproblémy Prvý ro pr rešení optmalzačných problémov (hľadáme najlepše rešene) je charaterzovať to hľadané najlepše rešene. Hovoríme, že problém v sebe obsahuje optmálnu podštrutúru práve vtedy eď, aždé najlepše rešene (môže ch byť predsa aj vac) v sebe obsahuje optmálne rešena podproblémov (naprílad najratša cesta v grafe obsahuje len najratše podcesty). Ďalším dôležtým uazovateľom, že by sme mohl použť dynamcé programovane je prelínane podproblémov. Teda, že množstvo rôznych podproblémov, toré treba vyrešť je malé. Keď reurzívne rešene stále prehľadáva rovnaé a rovnaé podproblémy, ta treba začať uvažovať nad využtím dynamcého programovana. aprot tomu, problém na torý je vhodná techna rozdeľuj-a-panuj generuje v aždom rou reurze celom nové podproblémy a teda by sme s ch len zbytočne pamätal. Rešene založené na dynamcom programovaní zvyne využívať výsledy už vyrešených podproblémov, aby ch, nesôr, nemuselo počítať vac razy. 4..2. Techna pamätana (memozaton) Typcé dynamcé programovane postupuje v herarch problémov od najmenších po najväčše. Varáca dynamcého programovana, torá zachováva prrodzenú orentácu od väčších problémov menším sa nazýva techna pamätana. Myšlena spočíva v zaznamenávaní výsledov, toré už raz reurzívny (neefetívny) program vypočítal a vždy, eď by ch mal počítať znovu, s ch už len prečíta z tabuľy, am s ch zapamätal. 4..3. Konštruca rešena Algortmus pracujúc na prncípe dynamcého programovana sa dá myšlenovo rozdelť na štyr čast, z torých sa štvrtá občas zanedbáva(ne vždy nás zaujíma onrétne rešene, stačí nám jeho hodnota) :. Charaterzovane optmálneho rešena 2. Reurzívna defníca optmálneho rešena 3. Výpočet rešena postupne smerom od menších podproblémov po väčše 4. Konštruca optmálneho rešena z vypočítanej nformáce Gymnázum Jura Hronca
Dynamcé programovane 4..4 ajdlhša (vybraná) spoločná podpostupnosť (Longest common subsequence) Teóra dynamcého programovana je jednoduchá. a zvládnute tohto postupu treba prerešť mnoho modelových úloh. My sa teraz budeme zaoberať nájdením najdlhšej spoločnej podpostupnost dvoch postupností. Podpostupnosť postupnost X je X s netorým (aj žadnym) prvam vynechaným. Predstavme s teraz dve postupnost X a Y. Z je spoločná podpostupnosť X a Y práve vtedy, eď je podpostupnosťou aždej z nch. Keď neestuje spoločná podpostupnosť s vacerým prvam, hovoríme že Z je najdlhša spoločná podpostupnosť (LCS). Dané X a Y, zaujíma nás nájsť najdlhšu spoločnú podpostupnosť. Aplujeme dynamcé programovane: reurzívne budeme počítať LCS postupností X a Y ta, že budeme postupne uvažovať predlžujúce sa LCS dvojíc prefov X a Y. ech X n je postupnosť <, 2,..., n > a Y m je postupnosť < y, y2,..., ym >. avac, nech Z =< z, z2,..., z > je ľubovoľná LCS postupností X n a Y m. Potom zrejme plata nasledujúce tvrdena: v A v A v A n = ym, potom z n = ym n ym, potom a n n ym, potom a ym = a Z - je LCS postupností X n- a Y m- z, Z musí byť LCS postupností X n- a Y m z, Z musí byť LCS postupností X n a Y m- Všmnme s, že na vyrešene problému pre (X n,y m ) potrebujeme vedeť výsledy pre (X n-,y m ), (X n,y m- ) a (X n-,y m- ). Pr reurzívnom rešení, aby sme nemusel v rôznych vetvách rešť rovnaé podproblémy vacrát, použjeme technu pamätana. Pramočare dynamcé programovane funguje ale ným spôsobom a to taým, že vždy eď potrebujeme mať nečo už vypočítané, ta to už máme je vypočítané postupujeme od menších problémov väčším. Kostra nášho rýdzeho rešena vyzerá potom nasledovne: for := 0 to n do for j := 0 to m do lcs[,j] := dĺža LCS postupností X a Y j Táto procedúra vypĺňa tabuľu lcs, de lcs[,j] obsahuje dĺžu LCS postupností X a Y j. Uvedomme s že, v čase eď počítame lcs[,j] bol všety menše podproblémy už vyrešené. ech teda máme vypočítané dĺžy najdlhších spoločných podpostupností pre všety možné začaty postupností X a Y, potom veme výslednú spoločnú podpostupnosť už jednoducho sonštruovať. Pozrme sa teraz na porade vypĺňana jednotlvých políčo tabuľy. V -tej terácí -cylu vyplníme -ty rado tabuľy s tým, že potrebujeme vedeť len výsledy predchádzajúceho radu. Tuto môžeme ušetrť nejaú pamäť. V prípade, že nás nezaujíma výsledná podpostupnosť, ale stačí nám len jej dĺža, je nám celá tabuľa lcs zbytočná, môžeme sa obmedzť len na predchádzajúc a ďalší rado. Pramočaro, uvedený algortmus má časovú zložtosť O (M ), pamäťová zložtosť závsí na požadavách, toré lademe na výsledo. Gymnázum Jura Hronca 2
Dynamcé programovane 4.2. Dynamcé programovane II. Dynamcé programovane sa hojne používa na rešene rozmantých problémov. Schopnosť vdeť problém v reč dynamcého programovana nespadne z neba ale vyžaduje bezprostredné súsenost s množstvom taýchto úloh. Ponúame prehľad 8 modelových úloh spolu s rešenam. Odporúčaný postup pr rešení je prečítať s zadane úlohy a snažť sa ju vyrešť bez nahladnuta do rešena. 4.2.. Modelové úlohy ajdlhša vybraná rastúca podpostupnosť Daná je onečná postupnosť celých čísel dĺžy,. Prvy tejto postupnost označíme po rade, 2,...,. Pod podpostupnosťou dĺžy vybranou z danej postupnost budeme rozumeť ľubovoľnú onečnú postupnosť tvaru,,...,, de < <... < 2 2 (tzv. zo zadanej postupnosť je vybraných ľubovoľných ne nutne susedných čísel, prčom je zachované ch porade. avrhnte algortmus, torý určí dĺžu najdlhšej rastúcej podpostupnost vybranej zo zadanej postupnost. To znamená, určí mamálne taé, že < <... <, pre nejaé ndey < <... < 2 2. ajdlhša súvslá rastúca podpostupnosť Daná je onečná postupnosť celých čísel dĺžy,. Prvy tejto postupnost označíme po rade, 2,...,. Pod súvslou podpostupnosťou dĺžy danej postupnost budeme rozumeť ľubovoľnú onečnú postupnosť tvaru,,..., + +, de < + (tzv. zo zadanej postupnosť je vybraných ľubovoľných susedných čísel). avrhnte algortmus, torý určí dĺžu najdlhšej súvslej rastúcej podpostupnost zadanej postupnost. To znamená, určí mamálne taé, že < + <... < +, pre nde < +. Problém batohu (Knapsac Problem) Zlodej, torý vyloml zámo na trezore, zstl, že je naplnení vecam rôznych veľostí a rôznej ceny. a lup má ale len batoh apacty M, problém batohu je práve nájsť taú ombnácu vecí z trezoru, aby sa mu zmestla do batoha a bola čo možno najcennejša. Dané sú veľost objetov S, S 2,..., S a ch ceny C, C2,..., C, treba nájsť taý výber objetov, 2,...,, aby S + S +... + S M a ch cena 2 C + C +... + C 2 bola najväčša možná. Domná (Domnoes CEOI 997, owy Sącz, Poland) Uvažujme oce domna nauladaných do radu. Každá oca má dve čísla A a B. Spočítajme rozdel súčtov čísel v hornom radu a dolnom radu: = = A B Jedno otočene je otočene jednej ocy domna opačne výmena jej čísel. Hľadáme najmenší počet otočení taý, aby rozdel Δ bol najmenší možný. = Gymnázum Jura Hronca 3
Dynamcé programovane Pre domná na obrázu nám postačuje jedno otočene (otočene poslednej ocy -2 naopa, potom bude súčet v hornom radu 0, v dolnom radu 0, taže menej sa určte už nedá). Plánovane prednášo (Schedulng Lectures, ACM 998, EastCentral orthamerca) a unverzte treba prebrať tém, aždá téma vyžaduje t, t,..., t 2 mnút na vysvetlene. Témy musa byť, vôl nadväznost, odučené v poradí,2,,, prčom žadnu tému ne je možné rozdelť medz prednášam (celú ju treba odučť v rámc jednej prednášy). Jedna prednáša má dĺžu L mnút. eedy je vhodné mať volný čas na onc prednášy, a prednášajúc sončí najvac o 0 mnút sôr, študent sú rad, že môžu odísť sôr, avša, a sa sončí sôr, budú sa cítť, že zo šoly nedostávajú dostato vedomostí. Mera nespoojnost DI (dssatsfacton nde) študentov je nasledovná: v DI = 0, a t = 0 v DI = C, a t 0 2 v na DI = ( t 0) de C je ladné celé číslo, t je množstvo voľného času na onc prednášy. Celová mera nespoojnost je súčet mer nespoojností jednotlvých prednášo. Úlohou je rozdelť témy do prednášo ta, aby sa využlo čo možno najmenej prednášo, a a je taých rozdelení vac, lepše je taé, toré má najmenšu meru nespoojnost študentov. Treba nájsť najlepše rozdelene. Zber jabĺ (Apples, USACO, Fall 2002) Farmár sa dohodol so svojou ravou, že mu zatrase jabloňou, a on bude chytať padajúce jablá. Veme, že, eď rava zatrase stromom, am (súradnce [,y] ) budú jednotlvé jablá padať a v aom časovom oamhu dopadnú. Farmár chytí jablo vtedy, eď sa bude nachádzať na súradncach dopadu v momente dopadu. a začato je Farmár na súradncach [0,0], veme jeho rýchlosť úlohou je zstť oľo najvac jabĺ je schopný chytť. Palndromcé cesty (Palndromc Ta Paths, USACO, Fall 2002) Daná je mreža prčom v aždom mrežovom bode sa nachádza nejaý symbol. Uvažujme mravčea pohybujúceho sa po mreže. Z mrežového bodu sa ve presunúť do susedných bodov (aj po dagonále). Začínajúc v ľubovoľnom bode bude chodť sem a tam, prčom prejde presne L bodov. Úlohou je zstť oľo rôznych palndromcých cest danej dĺžy môže usutočnť. Záps cesty nazveme postupnosť symbolov v mrežových bodov v poradí v aom nm prešel. Ceste je palndromcá vtedy, a je záps danej cesty palndrómom, teda a zne rovnao, eď ho prečítame spredu ao eď ho prečítame zozadu. Cesta oolo Kanady (Canada Tour, IOI 993, Mendoza, Argentna) Vyhral ste súťaž organzovanú Kanadsým aerolínam, dostal ste voľný lísto na cestovane oolo Kanady, začínajúc v najzápadnejšom meste obsluhovanom aerolínam, cestovaním len zo západu na východ do najvýchodnejšeho mesta a potom zase naspäť. Žadne mesto sa nesme navštívť vac razy, orem počatočného, toré musí byť navštívené práve dva razy. e je povolené používať an né prepravné prostredy ao Kanadsé aerolíne. Úlohou je, daných mest, ch porade od západu na východ a dvojce mest spojené lnou, určť najväčší počet mest v Kanade, toré sa dajú jedným taýmto oružným letom navštívť. Gymnázum Jura Hronca 4
Dynamcé programovane 4.2.2. Rešena úloh ajdlhša vybraná rastúca podpostupnosť Hľadáme dĺžu najdlhšej vybranej rastúcej podpostupnost. Z aóm logy vyplýva, že hľadaná postupnosť musí ončť v nejaom prvu pôvodnej postupnost. Označme s D( ) dĺžu najdlhšej vybranej rastúcej podpostupnost taej, že ončí v prvu pôvodnej postupnost. Trválne, eď veme čísla D( ), D( 2 ),..., D( ), veme z nch vybrať najväčše, čo bude naša hľadaná dĺža. Ao ale určíme čísla D( ), D( 2 ),..., D( )? Postupne. Predpoladajme, že už máme vypočítané čísla D( ), D( 2 ),..., D( - ) pre <, zaujíma nás vypočítať číslo D( ). Všmnme s teraz štrutúru najdlhšej vybranej podpostupnost ončacej v prvu eďže hľadáme rastúcu vybranú podpostupnosť, platí: D( ) = ma(,{ D( ) < }), čo nám už postačuje na nájdene našej dĺžy v čase O( 2 ). < Poznamenajme, že estuje rýchlejší algortmus pracujúc v čase O( log ), torý je jednoduchý, ale natoľo zaujímavý, že ho ponecháme na bádane čtateľom. ajdlhša súvslá rastúca podpostupnosť Hľadáme dĺžu najdlhšej súvslej rastúcej podpostupnost. Z aóm logy vyplýva, že hľadaná postupnosť musí ončť v nejaom prvu pôvodnej postupnost. Označme s D( ) dĺžu najdlhšej súvslej rastúcej podpostupnost taej, že ončí v prvu pôvodnej postupnost. Trválne, eď veme čísla D( ), D( 2 ),..., D( ), veme z nch vybrať najväčše, čo bude naša hľadaná dĺža. Ao ale určíme čísla D( ), D( 2 ),..., D( )? Postupne. Predpoladajme, že už máme vypočítané čísla D( ), D( 2 ),..., D( - ) pre <, zaujíma nás vypočítať číslo D( ). Všmnme s teraz štrutúru najdlhšej súvslej podpostupnost ončacej v prvu eďže hľadáme rastúcu súvslú podpostupnosť, platí: D ( ) = < D( ) = D( ) = D( Toto nám postačuje na nájdene našej dĺžy v čase O(). Všmnte s podobnosť štrutúry rešena tejto úlohy s predchádzajúcou úlohou. ) + Problém batohu (Knapsac Problem) Označme O,j ao najväčšu cenu vecí v batohu apacty j taú, že s môžeme vybrať spomedz vecí,...,. Potom číslo O,M prestavuje hodnotu vecí v najlepšom výbere vecí do batohu spomedz všetých vecí. Teto čísla budeme po čítať postupne, predstavme s, že máme vypočítané všety čísla pre =,2,...,M: O,,O 2,,,O -,, ďalše vypočítame nasledovne: O, = ma( O,,{ O, S + C S }) pre =,2,..., M Toto pozorovane nám dáva návod na sonštruovane rešena pracujúceho v čase O(M). Domná (Domnoes CEOI 997, owy Sącz, Poland) ajsôr s domná transformujeme ta, že aždému domnu bude prslúchať jedno číslo = A -B. Potom S = = a O,j označme ao mnmálny počet prelopení (a sa to nedá, ta O, j = ) netorých domín Gymnázum Jura Hronca 5
Dynamcé programovane z množny,..., ta, že súčet hodnôt v hornom radu na domnách,..., po prelopení bude j. Keď už toto máme vypočítané, ta stačí nájsť medz hodnotam O, taý súčet, torý veme nejaým otáčaním dosahnuť a rozdel S- - bude najmenší možný. A bude taýchto rozdelov vac (môže byť ešte jeden symetrcý podľa 2S ), ta vybereme ten, torý prelopí oprot pôvodnému stavu menej domín. Teto čísla budeme po čítať postupne, predstavme s, že máme vypočítané všety čísla pre =,2,...,S: O,,O 2,,,O -,, ďalše vypočítame nasledovne: pre =,2,..., S : P = { O 0} { O > 0 < } Q O,,, = { O,, + = mn( P, +, Q, ), < 0} { O, + Kde P, orešponduje s možnosťou, že -te domno neotočíme a Q, s možnosťou, že -te domno otočíme. Toto pozorovane nám dáva návod na sonštruovane rešena pracujúceho v čase O(S). Všmnte s podobnosť štrutúry rešena s predchádzajúcm príladom. > 0} Plánovane prednášo (Schedulng Lectures, ACM 998, EastCentral orthamerca) Označme C,j ao najmenší počet prednášo, v torých sme schopný odučť témy,...,, prčom v poslednej použtej prednáše zostáva ešte j voľných mnút. D,j bude pre daný mnmálny počet prednášo mnmálna mera nespoojnost študentov (bez mery nespoojnost v poslednej ešte neuzatvorenej prednáše). Výsledo potom bude netorý z (C,j,D,j ) podľa toho, torý bude najlepší po uzatvorení poslednej prednášy. Ao budeme uvedené čísla počítať? Postupne. Predstavme s že už máme vypočítané všety čísla pre = 0,,2,...,L: C,,C 2,,,C -,, a D,,D 2,,,D -,, ďalše vypočítame ta, že pre = 0,,2,...,L z (C -,, D -, ) zohľadníme prdane -tej témy buď do atuálnej prednášy, alebo uzatvorene poslednej prednášy a vytvorene novej. Toto robíme v duchu toho, aby s čísla C,j a D,j zachoval hore defnovaný význam. Táto myšlena postačuje na vytvorene algortmu bežaceho v čase O(L), torý nám určí najlepší výber prednášo. Zber jabĺ (Apples, USACO, Fall 2002) Prdáme s jedno jablo, toré spadne do bodu [0,0] v čase 0, toto jablo farmár určte chytí, a teda výsledo tato zmodfovanej úlohy bude o jedna väčší ao pôvodnej úlohy. Jednotlvé jablá s označíme a 0, a,..., a, prčom jablo a 0 je to naše umelo prdané. Označme s rýchlosť pohybu farmára, t, čas v torom padne jablo a a d,j ao vzdalenosť dopadu jabĺ a a a j. Defnujme s potom nasledovné usporadane prvov (jabĺ): ( a < a ) ( j Teda jablo a bude menše ao jablo a j práve vtedy, eď platí, že a by sa farmár po dopade jabla a hneď rozbehol mestu dopadu jablu a j, sthol by ho chytť. Už nám stačí jablá len utredť vzostupne podľa času dopadu a zostáva vyrešť úlohu o najdlhšej vybranej rastúcej podpostupnost z postupnost jabĺ a,..., a. d, j s t j t ) Gymnázum Jura Hronca 6
Dynamcé programovane Palndromcé cesty (Palndromc Ta Paths, USACO, Fall 2002) Hľadáme počet všetých palndromcých cest určtej dĺžy. Z aóm logy vyplýva, že aždá cesta, torú započítame musí nede začínať a nede ončť. Označme preto C [A,B],[C,D],L počet palndromcých cest dĺžy L, toré začínajú na súradncach [A,B] a onča na súradncach [C,D]. aše hľadané číslo bude potom súčet všetých C [A,B],[C,D],L taých, že A,B,C,D. Všmnme s teraz štrutúru nejaej palndromcej cesty dĺžy K 2. Prvý a posledný prvo tejto cesty a teda palndromcá cesta dĺžy K, sa sladá s nejaej palndromcej cesty dĺžy K-2. Toto pozorovane nám už dáva postup, ao vypočítať počet palndromcých cest dĺžy L. Počty palndromcých cest budeme počítať postupne. Uvažujme, že už máme vypočítané počty cest pre všety A,B,C,D : C [A,B],[C,D],, C [A,B],[C,D],2,..., C [A,B],[C,D],K-. Počet palndromcých cest dĺžy K je potom: [ E, F] [ G, H ] C[ E, = 0 C[ E, = [ E, F] [ G, H ] C[ E, = M [ E, M = { C ( A E + B F ) = ( C G + D H ) = } [ E, [ A, B],[ C, D], K 2 Toto nám dáva návod na sonštruovane algortmu bežaceho v čase O(L 4 ). Cesta oolo Kanady (Canada Tour, IOI 993, Mendoza, Argentna) amesto toho, aby sme hľadal najsôr cestu tam, potom späť, budeme hľadať teto cesty naraz. Označme O,j ao najväčší počet mest, toré môžeme navštívť, a pôjdeme nejaou cestou z mesta do mesta, prčom druhou (dsjuntnou neobsahuje žadne rovnaé mesto) cestou pôjdeme z vrcholu do vrcholu j. Hľadané číslo potom bude O,. Čísla budeme počítať postupne ta, že vždy, eď budeme počítať číslo O,j, ta veme, že už máme všety čísla tvaru O a,b pre a a b j už vypočítané. Pre O,j (<j) potom platí: O, j = ma({ O, + < ( j }) { O, + < < j ( j) }) Čo orešponduje s posunom jedného cestovateľa do oblastí, toré druhý cestovateľ ešte nevdel a teda to zaručuje dsjuntnosť trás. Toto nám umožňuje zostrojť algortmus pracujúc v čase O( 2 ). 4.2.3. Dodato využtu dynamcého programovana A chceme úlohu úspešne vyrešť použtím dynamcého programovana, vyžaduje s to, aby sme sa zamyslel nad štrutúrou optmálneho rešena, optmálne rešene defnoval pomocou menších alebo jednoduchého rozšírena menších rešení. Všeto sa robí v duch počítana celového rešena od záladov od najmenších rešení až po vrchol pyramídy zadaná úloha. 4.2.4. Časové a pamäťové nároy Pr rešení ne sú dôležté len požadavy na čas výpočtu, ale aj na množstvo spotrebovaných pamäťových zdrojov. Vo väčšne prípadov, ale ne vždy, úlohy rešteľné dynamcým programovaním majú zaujímavú vlastnosť, že pre veľosť vstupu, pamäťové nároy ladené na program sú -rát menše ao časové nároy. Tento rozdel, vzná vôl spôsobu onštruce väčšeho rešena z menšeho. Postup väčšemu rešenu s často vyžaduje prebrať nejaú množnu menších rešení, toré sombnujeme, alebo z torých s vybereme jeden najlepší. Teda pre výpočet ďalšeho prvu, potrebujeme prebrať veľa (zhruba ) menších. Gymnázum Jura Hronca 7