Dynamické programovanie

Σχετικά έγγραφα
Start. Vstup r. O = 2*π*r S = π*r*r. Vystup O, S. Stop. Start. Vstup P, C V = P*C*1,19. Vystup V. Stop

Matematika Funkcia viac premenných, Parciálne derivácie

Obvod a obsah štvoruholníka

Ekvačná a kvantifikačná logika

Komplexné čísla, Diskrétna Fourierova transformácia 1

7. FUNKCIE POJEM FUNKCIE

1. Limita, spojitost a diferenciálny počet funkcie jednej premennej

Matematika prednáška 4 Postupnosti a rady 4.5 Funkcionálne rady - mocninové rady - Taylorov rad, MacLaurinov rad

,Zohrievanie vody indukčným varičom bez pokrievky,

ARMA modely čast 2: moving average modely (MA)

Motivácia Denícia determinantu Výpo et determinantov Determinant sú inu matíc Vyuºitie determinantov. Determinanty. 14. decembra 2010.

Cvičenie č. 4,5 Limita funkcie

1. písomná práca z matematiky Skupina A

ARMA modely čast 2: moving average modely (MA)

Jednotkový koreň (unit root), diferencovanie časového radu, unit root testy

Goniometrické rovnice a nerovnice. Základné goniometrické rovnice

Úvod do lineárnej algebry. Monika Molnárová Prednášky

M6: Model Hydraulický systém dvoch zásobníkov kvapaliny s interakciou

Získať nejaké body v tejto úlohe je ľahké: stačí vygenerovať všetky trojice a usporiadať ich podľa súčtu:

Chí kvadrát test dobrej zhody. Metódy riešenia úloh z pravdepodobnosti a štatistiky

Prechod z 2D do 3D. Martin Florek 3. marca 2009

KATEDRA DOPRAVNEJ A MANIPULAČNEJ TECHNIKY Strojnícka fakulta, Žilinská Univerzita

Planárne a rovinné grafy

Gramatická indukcia a jej využitie

MOSTÍKOVÁ METÓDA 1.ÚLOHA: 2.OPIS MERANÉHO PREDMETU: 3.TEORETICKÝ ROZBOR: 4.SCHÉMA ZAPOJENIA:

Moderné vzdelávanie pre vedomostnú spoločnosť Projekt je spolufinancovaný zo zdrojov EÚ M A T E M A T I K A

3. Striedavé prúdy. Sínusoida

Tomáš Madaras Prvočísla

Riešenie sústavy lineárnych rovníc. Priame metódy.

Odporníky. 1. Príklad1. TESLA TR

RIEŠENIE WHEATSONOVHO MOSTÍKA

p(α 1 ) = u 1. p(α n ) = u n. Definícia (modulárna reprezentácia polynómu). Zobrazenie

Definícia parciálna derivácia funkcie podľa premennej x. Definícia parciálna derivácia funkcie podľa premennej y. Ak existuje limita.

6 Limita funkcie. 6.1 Myšlienka limity, interval bez bodu

u R Pasívne prvky R, L, C v obvode striedavého prúdu Činný odpor R Napätie zdroja sa rovná úbytku napätia na činnom odpore.

Kompilátory. Cvičenie 6: LLVM. Peter Kostolányi. 21. novembra 2017

Meranie na jednofázovom transformátore

PROMO AKCIA. Platí do konca roka 2017 APKW 0602-HF APKT PDTR APKT 0602-HF

C. Kontaktný fasádny zatepľovací systém

CHÉMIA Ing. Iveta Bruončová

4. Výrokové funkcie (formy), ich definičný obor a obor pravdivosti

2 Chyby a neistoty merania, zápis výsledku merania

Goniometrické substitúcie

6 APLIKÁCIE FUNKCIE DVOCH PREMENNÝCH

Michal Forišek: Early beta verzia skrípt z ADŠ

x x x2 n

STRIEDAVÝ PRÚD - PRÍKLADY

AerobTec Altis Micro

Kontrolné otázky na kvíz z jednotiek fyzikálnych veličín. Upozornenie: Umiestnenie správnej a nesprávnych odpovedí sa môže v teste meniť.

Analýza údajov. W bozóny.

Jednotkový koreň (unit root), diferencovanie časového radu, unit root testy

Metódy vol nej optimalizácie

MATEMATICKÁ OLYMPIÁDA

Riešenie rovníc s aplikáciou na elektrické obvody

Deliteľnosť a znaky deliteľnosti

Návrh vzduchotesnosti pre detaily napojení

UČEBNÉ TEXTY. Pracovný zošit č.2. Moderné vzdelávanie pre vedomostnú spoločnosť Elektrotechnické merania. Ing. Alžbeta Kršňáková

1 Prevod miestneho stredného slnečného času LMT 1 na iný miestny stredný slnečný čas LMT 2

24. Základné spôsoby zobrazovania priestoru do roviny

MIDTERM (A) riešenia a bodovanie

Funkcie - základné pojmy

Pevné ložiská. Voľné ložiská

Matematika 2. časť: Analytická geometria

Numerické metódy matematiky I

Aproximačné algoritmy. (7. októbra 2010) DRAFT

Rentový počet. Rentový počet. Monika Molnárová. Technická univerzita Košice.

Matematika 2. časť: Funkcia viac premenných Letný semester 2013/2014

Priamkové plochy. Ak každým bodom plochy Φ prechádza aspoň jedna priamka, ktorá (celá) na nej leží potom plocha Φ je priamková. Santiago Calatrava

Numerické metódy Učebný text pre bakalárske štúdium

1. Dátové štruktúry pre geometrické algoritmy

Analýza a návrh algoritmov z matematiky

4.1. Úvod do dynamického programovania (Dynamic programming)

Modelovanie dynamickej podmienenej korelácie kurzov V4

Obsah. 1.1 Reálne čísla a ich základné vlastnosti Komplexné čísla... 8

Podnikateľ 90 Mobilný telefón Cena 95 % 50 % 25 %

Derivácia funkcie. Pravidlá derivovania výrazov obsahujúcich operácie. Derivácie elementárnych funkcií

Integrovanie racionálnych funkcií

3. prednáška. Komplexné čísla

Možnosti rozhodovacích agentov hrajúcich hracie karty. Bakalárska práca. Juraj Barič. Univerzita FMFI KI Informatika. Vedúci bc.

Obyčajné diferenciálne rovnice

Rozsah hodnotenia a spôsob výpočtu energetickej účinnosti rozvodu tepla

PRIEMER DROTU d = 0,4-6,3 mm

Zložené funkcie a substitúcia

Zrýchľovanie vesmíru. Zrýchľovanie vesmíru. o výprave na kraj vesmíru a čo tam astronómovia objavili

HASLIM112V, HASLIM123V, HASLIM136V HASLIM112Z, HASLIM123Z, HASLIM136Z HASLIM112S, HASLIM123S, HASLIM136S

Einsteinove rovnice. obrázkový úvod do Všeobecnej teórie relativity. Pavol Ševera. Katedra teoretickej fyziky a didaktiky fyziky

ΑΛΓΟΡΙΘΜΟΙ Άνοιξη I. ΜΗΛΗΣ

Metódy numerickej matematiky I

Reálna funkcia reálnej premennej

VLASTNÉ ČÍSLA A JORDANOV KANONICKÝ TVAR. Michal Zajac. 3 T b 1 = T b 2 = = = 2b

Život vedca krajší od vysnívaného... s prírodou na hladine α R-P-R

KATALÓG KRUHOVÉ POTRUBIE

UČEBNÉ TEXTY. Pracovný zošit č.5. Moderné vzdelávanie pre vedomostnú spoločnosť Elektrotechnické merania. Ing. Alžbeta Kršňáková

1.1 Zobrazenia a funkcie

ZADANIE 1_ ÚLOHA 3_Všeobecná rovinná silová sústava ZADANIE 1 _ ÚLOHA 3

REZISTORY. Rezistory (súčiastky) sú pasívne prvky. Používajú sa vo všetkých elektrických

η = 1,0-(f ck -50)/200 pre 50 < f ck 90 MPa

Lineárna algebra I - pole skalárov, lineárny priestor, lineárna závislosť, dimenzia, podpriestor, suma podpriestorov, izomorfizmus

INTELIGENTNO UPRAVLJANJE

Ispitivanje toka i skiciranje grafika funkcija

Transcript:

7. prednáška (4.4.2016) Dynamické programovanie alebo Bol raz jeden problém... 1

Čo už vieme Asymptotická časová zložitosť algoritmov Základné údajové štruktúry: spájaný zoznam, strom, zásobník, rad možnosti ich efektívnej implementácie príklady ich aplikácie pri riešení rôznych úloh Rekurzia ako dôležitý programovací koncept na zápis algoritmov Metódy riešenia problémov (=úloh): rozdeľuj a panuj backtracking 2

Rozdeľuj a panuj! Divide et impera armádna, politická a ekonomická stratégia jedna zo základných stratégií riešenia problémov v informatike Princíp stratégie: rozdeliť problém na podproblémy vyriešiť podproblémy ak treba, tak z riešení podproblémov vytvoriť riešenie pre pôvodný problém 3

Rozdeľuj a panuj Stratégiu rozdeľuj a panuj sme už používali: QuickSort pivotizácia rozdelí problém (postupnosť) na dva menšie problémy (postupnosti) problémy vyriešime, ich vyriešením máme riešenie pre pôvodný problém MergeSort rozdelíme problém (postupnosť) na dva menšie podproblémy a vyriešime ich z riešení podproblémov vytvoríme riešenie problému pomocou algoritmu na zlúčenie dvoch utriedených (usporiadaných) postupností 4

Schéma (ešte raz): Rozdeľuj a panuj rozdeľ problém na menšie (jednoduchšie) podproblémy vyrieš podproblémy z riešení podproblémov vytvor riešenie pre pôvodný problém (skombinovanie riešení) QuickSort zložité rozdeľovanie, jednoduché kombinovanie riešení MergeSort jednoduché rozdeľovanie, zložité kombinovanie riešení 5

Ďalšie príklady, ktoré už poznáme: Rozdeľuj a panuj konštrukcia stromu z inorder a preorder postupnosti konštrukcia stromu zo zátvorkového popisu ((1) 3 (2)) Ďalšie úlohy: vyhodnotenie aritmetického výrazu nájdenie mediánu 6

7

Čo robia v banke? Banky môžu emitovať dlhopisy (cenné papiere) dlhopis má svoju nominálnu hodnotu (napr.100 ) každý druh emitovaného dlhopisu musí schváliť CDCP (centrálny depozitár CP) banka necháva schvaľovať malý počet druhov dlhopisov Príklad: Banka sa rozhodne emitovať 3 druhy dlhopisov s nominálnymi hodnotami 100, 500, 800, t.j., musí požiadať CDCP o schválenie 3 druhov CP 8

Šetrenie (Ako bojovať s krízou) Klient pri kúpe dostane od banky dlhopisy (cenné papiere) na špeciálnom papieri Špeciálny papier je drahý Problém: Ak klient chce nakúpiť dlhopisy za 1000, dlhopisy v akej nominálnej hodnote a v akom počte vydať, aby sa použilo čo najmenej papiera? (banka chce ušetriť, klient nechce skladovať veľa papiera ) Je vôbec možné kúpiť dlhopisy v požadovanej hodnote? 9

Príklad Emitované dlhopisy: 100, 500, 800 Suma: 1300 2 x 500, 3 x 100-5 papierov 1 x 800, 1 x 500-2 papiere Suma: 250 nemožno kúpiť cenné papiere 10

IT oddelenie Potrebujeme softvér, ktorý nám pre zadanú sumu povie, či ju možno previesť na dlhopisy, a ak áno, tak povie, dlhopisy s akými hodnotami použiť. 11

Greedy stratégie greedy stratégie (založené na najlepšom okamžitom rozhodnutí) nefungujú: kým sa dá, vyberať papier s najvyššou nominálnou hodnotou emitované papiere: 100, 500, 800 1100 = 800 + 100 + 100 + 100 1100 = 500 + 500 + 100 nájsť papier s najvyššou nominálnou hodnotou, ktorá delí požadovanú sumu emitované papiere: 100, 500, 800 1100 = 11 x 100 12

Formalizácia problému n typov dlhopisov s nominálnymi hodnotami: h[0], h[1],, h[n-1] Zovšeobecnené označenie: R[m] minimálny počet dlhopisov potrebných na vyplatenie sumy m, ak také vyplatenie neexistuje Špeciálna hodnota pre nedá sa vyplatiť Pre začiatok nám stačí vypočítať, či sumu ide vyplatiť, a ak áno, tak koľko na to treba dlhopisov (cenných papierov). Okamžité pozorovanie: ak m = h[i] pre nejaké i, potom R[m] = 1 13

Rôzne typy rezistorov: Reinterpretácia pre fyzikov 10Ω, 22Ω, 47Ω, 100Ω, 270Ω z každého typu si vieme objednať ľubovoľný počet Pri zapojení do série je výsledný odpor súčet odporov jednotlivých rezistorov. Problém: Aký najmenší počet rezistorov treba na sériové zapojenie so zadaným celkovým odporom? 14

Ako to vyriešiť? Máme nový výpočtový cluster za pár miliónov, problém je zdá sa tažký, ale bactracking to spraví. 15

Backtracking Suma: 3000 0 1 2 100 500 800 3000 = 2.100 + 4.500 + 1.800 0 1 2 2 4 1 Nominálne hodnoty dlhopisov Generujeme všetky možné vyplatenia sumy 3000, t.j., koľko akých dlhopisov použiť. Generujeme čísla: 0..Suma/800 Generujeme čísla: 0..Suma/100 Generujeme čísla: 0..Suma/500 16

Backtracking - zefektívnenie Suma: 3000 0 1 2 100 500 800 Nominálne hodnoty dlhopisov 3000 = 7.100 +?.500 +?.800 0 1 2 7 Ostáva: 3000 7.100 = 2300 Generujeme čísla: 0..2300/500=0..4 17

Backtracking vylepšenia Súčet počtu dlhopisov a zostávajúcu sumu vypočítavame priebežne Pri generovaní početností jednotlivých typov dlhopisov zohľadňujeme výšku zostávajúcej sumy Hodnoty dlhopisov v klesajúcom poradí Zdá sa, že to funguje! 18

VIP klient 19

Kde to zlyhalo? Výpočet trvá pridlho pre veľké sumy Čas výpočtu zásadne rastie s počtom typov dlhopisov Toto je kombinatorický problém. Nech ho riešia matematici a analytici! Pri n typoch dlhopisov máme minimálne 2 n rôznych vyplatení 20

Analýza problému Backtracking zlyhal, skúsme rozdeľuj a panuj. Ako vieme rozložiť problém na menšie podproblémy? 21

Analýza optimálneho riešenia Minimálny počet dlhopisov pre sumu 8900 Minimálny počet dlhopisov pre sumu 8400 22

Pozorovanie Nech d 1 + d 2 +. + d k = m je také rozdelenie sumy m na k dlhopisov, že k je najmenšie možné a d i є {h[0], h[1],, h[n-1]} pre všetky i. Pozorovanie: d 1 + d 2 +. + d k-1 je vyplatenie sumy m-d k s minimálnym počtom dlhopisov, t.j. R[m] = R[m-d k ]+1 Dôkaz (spor s optimalitou): A d k je??? ak by m-d k išlo vyplatiť menej než k-1 dlhopismi, potom nám stačí k tomuto vyplateniu priložiť dlhopis d k a máme vyplatenie sumy m menej ako k dlhopismi. 23

minimum pre 1400 minimum pre 1000 minimum pre 700 Čo vieme povedať o kôpkách? 1400+100 1000+500 700+800 Jedna z kopiek je minimálna pre 1500 Žiadna z zvyšných kopiek nemá menej papierov ako minimálna (optimálna) 24

Optimálne riešenie 3 = 2+1 3-100 R[1400] R[1500] 2-500 R[1000] 3 V optimálnom vyplatení sumy 1500 musí byť na vrchu jeden z dlhopisov a po jeho odstránení nám ostane optimum pre zvyšnú sumu. -800 R[700] 25

Magický vzorec Rekurzívny vzorec vyjadrujúci optimálne riešenie na základe optimálnych riešení menších problémov (vyplatenia menších súm) R[0] = 0 R[m] = 1 + min {R[m h[i]] i = 0..n-1} ak pre niektoré i je R[m-h[i]] rôzne od R[m] = nedá sa ( ), inak Programujeme (rekurzívne) a testujeme 26

Efektívnosť? Nájdenie riešenia je extrémne pomalé aj pre nízke sumy a malé počty nominálnych hodnôt dlhopisov. Nepraktické riešenie pre prax... Analyzujme strom volaní a priebeh výpočtu... 27

Strom volaní R[1000] R[900] R[500] R[800] R[100] R[1100] R[600] R[200] R[500] R[100] R[1200] R[700] R[300] R[200] R[100] R[600] R[500] R[200] R[100] R[400] R[300] R[200] R[100] 28

Dá sa s tým niečo spraviť? Pozorovanie: Zbytočne opakované výpočty ak raz vypočítame, že na sumu 200 treba 2 cenné papiere, tak to tak bude stále (pri rovnakých nominálnych hodnotách dlhopisov) Ako zabráňiť opakovaným výpočtom toho istého? Zavedenie cache po vypočítaní medzivýsledku, si ho uložíme, aby sme ho už opäť nemuseli počítať. 29

Ukladanie medzivýsledkov Vytvoríme dostatočne veľké pole a inicializujeme ho na dohodnutú hodnotu indikujúcu, že pre danú sumu výsledok ešte nebol vypočítaný. int[] cache = new int[suma+1]; Arrays.fill(cache, NEBOLO_POCITANE); Zmena v algoritme: prv než začneme počítať, overíme, či už nemáme výsledok vypočítaný if (cache[suma]!= NEBOLO_POCITANE) return cache[suma]; Dohodnutá hodnota = ešte nemáme vypočítané 30

Časová zložitosť Suma m, n nominálnych hodnôt dlhopisov: skúmaných je vyplatenie nanajvýš m (O(m)) rôznych súm na zistenie vyplatenia jednej hodnoty treba čas O(n), ak nezaratávame čas riešenia podproblémov vyplatenie každej sumy je počítané nanajvýš raz (vďaka uchovaniu medzivýsledkov) Celkový čas: O(m.n) pseudopolynomiálny čas Celková pamäť: O(m+n) 31

Ako to celé dopadlo? 32

Prístup zdola-nahor Ukladanie medzivýsledkov memoizácia prístup zhora-nadol (od problému k podproblémom) cache pamäť (pole medzivýsledkov) môžeme systematicky vyplniť počnúc najmenšími hodnotami prístup zdola-nahor: z riešení problémov budujeme riešenia väčších problémov začíname triviálnymi prípadmi možno vyplníme trochu viac, než treba... 33

Nominálne hodnoty dlhopisov: 1, 3 Príklad vypĺňania 0 1 2 3 4 5 6 7 0 1 2 1 2 3 2? 2 = 1 + min{1, 3} Nominálne hodnoty dlhopisov: 2, 5 0 1 2 3 4 5 6 7 0 1 2 1 3? 34

Ako nájsť vyplatenie? Algoritmus vypočíta minimálny počet dlhopisov potrebných na vyplatenie sumy (optimálne riešenie), ale nenájde, aké dlhopisy máme použiť Riešenie: Pre každú sumu si budeme pamätať akým dlhopisom sme našli optimálne vyplatenie danej sumy Spätným prechodom zrekonštruujeme optimálne riešenie 35

Ako nájsť vyplatenie? Nominálne hodnoty dlhopisov: 1, 3 0 1 1 3 1 3 3? 0 1 2 3 4 5 6 7 0 1 2 1 2 3 2? Hodnota dlhopisu, ktorý je v nejakom optimálnom vyplatení danej sumy. 2 = 1 + min{1, 3} Nominálne hodnoty dlhopisov: 2, 5 0 0 2 0 2 5 2? 0 1 2 3 4 5 6 7 0 1 2 1 3? 36

Dynamické programovanie Formalizácia riešenia, definovanie podproblémov, charakterizovanie štruktúry optimálneho riešenia Magický vzorec na výpočet optimálneho riešenia z optimálnych riešení podproblémov Skonštruovanie riešení z riešení podproblémov prístupom zdola-nahor ( vyplnenie tabuľky ) Nájdenie hodnoty optimálneho riešenia Zrekonštruovanie optimálneho riešenia (spätným prechodom) 37

Nič nové... Postup, ktorý sme použili pri riešení bankového problému už poznáme: Fibonacciho čísla F(n) = F(n-1) + F(n-2) sme riešili aj vyplňaním poľa Fibonacciho čísla ide riešiť aj bez poľa s použitím 3 premenných Idea: na vyplnenie políčka poľa nám stačia len dve predchádzajúce hodnoty Podobnú fintu ide často použiť aj pri dynamickom programovaní v bankovom probléme potrebujeme max{h[i]} predchádzajúcich políčok 38

Kedy dynamické programovanie? Optimálna podštruktúra optimálne riešenie je možné získať z optimálnych riešení podproblémov Prekrývajúce sa podproblémy celkový počet rôznych podproblémov musí byť relatívne malý Prístup zdola-nahor od malých problémov k väčším... 39

Ď ť 40

Najdlhšia vybraná rastúca podpostupnosť 41

Najdlhšia vybraná rastúca podpostupnosť Postupnosť n čísel: 5 3 1 4 6 2 8 7 Ako vybrať čo najviac čísel tak, aby vybrané čísla tvorili rastúcu podpostupnosť? 5 3 1 4 6 2 8 7 3 < 4 < 6 < 8 Iné riešenie: 5 3 1 4 6 2 8 7 Existuje riešenie, kde vyberieme viac ako 4 čísla? 42

Charakterizovanie štruktúry D[i] dĺžka najdlhšej vybranej rastúcej podpostupnosti, ktorá končí v i-tom prvku (a obsahuje ho) Uvažujme najdlhšiu vybranú rastúcu podpostupnosť, ktorá končí vo zvolenom prvku postupnosti (a obsahuje ho)......? 8 Optimálne riešenie predĺžuje o jeden prvok (8) nejakú najdlhšiu vybranú rastúcu podpostupnosť, ktorá končí v nejakom prvku, ktorý je naľavo od 8 a je menší ako 8. 43

Magický vzorec D[i] dĺžka najdlhšej vybranej rastúcej podpostupnosti, ktorá končí v i-tom prvku (a obsahuje ho) Nevieme, ktorú podpostupnosť predĺžujeme, ale určite je to nejaká, ktorá končí v nejakom menšom prvku naľavo... P:......? 8 D[i] = 1 + max {0, D[j]: 0 j < i a P[j] < P[i]} Skúšame predĺžiť každú vhodnú podpostupnosť končiacu naľavo od P[i] a vyberieme maximum. 44

Zdola-nahor D[i] = 1 + max {0, D[j]: 0 j < i a P[j] < P[i]} int[] d = new int[p.length]; Na určenie D[i] treba mať vypočítané D[j] pre j < i. Preto D budeme počítať postupne D[0], D[1], D[2], for (int i = 0; i < p.length; i++) { d[i] = 1; for (int j = 0; j < i; j++) if (p[j] < p[i]) d[i] = Math.max(d[i], d[j] + 1); } 45

Hodnota optimálneho riešenia Nevieme, v ktorom prvku postupnosti končí globálne najdlhšia vybraná rastúca podpostupnosť... Vyberieme tú najdlhšiu: int najdlhsia = 0; for (int i=0; i<d.length; i++) najdlhsia = Math.max(najdlhsia, d[i]); Ako rýchlo zrekonštruovať optimálne riešenie? Akú pomocnú informáciu potrebujeme uchovať pri výpočte poľa d? 46

Najdlhšia spoločná podpostupnosť 47

LCS LCS (Longest common subsequence) najdlhšia spoločná podpostupnosť 2 postupnosti (môžu byť aj rôznej dĺžky) hľadáme najdlhšiu spoločnú podpostupnosť Použitie: hľadanie rozdielov v textoch (v Linuxe príkaz diff), hľadanie génových mutácií 48

Formalizácia, podproblém Postupnosti (pozor, indexujeme od 1): a 1, a 2,, a n b 1, b 2,, b m Podproblém: LCS(i, j) dĺžka najdlhšej spoločnej podpostupnosti z postupností a 1, a 2,, a i a b 1, b 2,, b j Náš cieľ: LCS(n, m) Triviálne fakty: LCS(0,?) = 0, LCS(?, 0) = 0 49

Magický vzorec pre LCS Zoberme si nejaké optimálne riešenie pre LCS(i, j), potom platí jedno z nasledujúceho: a i je v optimálnom riešení a b j nie je LCS(i, j) = LCS(i, j-1) a i nie je v optimálnom riešení a b j je LCS(i, j) = LCS(i-1, j) ani a i a ani b j nie sú v optimálnom riešení Ide ukázať sporom LCS(i, j) = LCS(i-1, j-1) a a i!=b j a i aj b j sú v optimálnom riešení LCS(i, j) = 1 + LCS(i-1, j-1) a a i =b j 50

Magický vzorec pre LCS Ak a i =b j, potom LCS(i, j) = 1 + LCS(i-1, j-1) Ak a i a b j sú v nejakej optimálnej podpostupnosti, potom nie je čo riešiť a LCS(i, j) = 1 + LCS(i-1, j-1) Ak len jedno z a i a b j nie je v optimálnej postupnosti, tak existuje optimálna postupnosť, kde sú obe (prečo?) Ak a i a b j nie sú spoločne v nejakej optimálnej podpostupnosti, potom ich môžeme pridať na koniec nejakej optimálnej podpostupnosti, čím ju predlžíme (spor s optimalitou) Ak a i!=b j, potom LCS(i-1, j-1) <= LCS(i, j-1) a LCS(i-1, j-1) <= LCS(i-1, j) <= LCS(i-1, j-1)+1 51

Magický vzorec pre LCS LCS(0, j) = 0 LCS(i, 0) = 0 Ak a i =b j, potom LCS(i, j) = 1 + LCS(i-1, j-1) Ak a i!=b j, potom LCS(i, j) = max{lcs(i-1, j), LCS(i, j-1)} 52

Algoritmus public static int vypocitajlcs(string s1, String s2) { int[][] lcs = new int[s1.length()+1][s2.length()+1]; for (int i = 1; i < s1.length()+1; i++) for (int j = 1; j < s2.length()+1; j++) if (s1.charat(i-1) == s2.charat(j-1)) lcs[i][j] = 1 + lcs[i-1][j-1]; else lcs[i][j] = Math.max(lcs[i-1][j], lcs[i][j-1]); } return lcs[s1.length()][s2.length()]; Časová zložitosť: O(m.n) Pamäťová zložitosť: O(m.n) 53

Príklad tabuľky Spätným prechodom a poznačením si, ako sa dosiahlo optimum, vieme zrekonštruovať LCS 54