Dnaamiline planeerimine Ahto Truu ahto truuut ee Fibonacci
Dünaamiline planeerimine Ahto Truu ahto. truu@ut. ee
Fibonacci jada
Naiivne lahendus function fib(n : longint) : longint; begin if n = 0 then exit(0); if n = 1 then exit(1); exit(fib(n - 1) + fib(n - 2)); end;
Mäluga lahendus const max = 100000; var a : array [2. . max] of longint; function fib(n : longint) : longint; begin if n = 0 then exit(0); if n = 1 then exit(1); if a[n] = 0 then a[n] : = fib(n - 1) + fib(n - 2); exit(a[n]); end;
Naiivne DP const max = 100000; var a : array [0. . max] of longint; function fib(n : longint) : longint; var i : longint; begin a[0] : = 0; a[1] : = 1; for i : = 2 to n do a[i] : = a[i - 1] + a[i - 2]; exit(a[n]); end;
Kokkuhoidlik DP var a : array [0. . 2] of longint; function fib(n : longint) : longint; var i : longint; begin a[0] : = 0; a[1] : = 1; for i : = 2 to n do a[i mod 3] : = a[(i - 1) mod 3] + a[(i - 2) mod 3]; exit(a[n mod 3]); end;
Lahendamise suund n “Ülalt alla” tükeldamine – mäluga rekursioon – sageli lihtsam taibata n “Alt üles” kokkukleepimine – “stiilipuhas” DP – võib olla efektiivsem
Mustkunstnik n Kaardipakk, N kaarti n Vaja valida komplekt, K kaarti n Kaartide järjekord pole oluline n Minu erinevat võimalust on? (Mustkunstnik, EIO 13. 03. 2004)
Kombinatsioonid
Maksimaalne summa n Nx. M arvutabel n Liikuda vasakust alumisest nurgast paremasse ülemisse nurka n Igal sammul paremale või üles n Läbitud ruutude summa: max (Summa, EIO 15. 12. 2001)
Tagasiviited n Maksimaalne summa aga kuidas me selle saavutasime? n Maksimumi saavutamisel jätta meelde eelmine olek n Sageli parem lahendada ülesannet tagantpoolt ettepoole
Jadaülesanded n Alamülesanneteks antud jada – prefiksid (kokku N) – alamjadad (kokku N 2) n Ülesande tekst annab vihje: – 1000000 operatsiooni – N kuni 100 alamjadad – N kuni 1000 prefiksid – N suurem fiks. arv alamaid
Maksimaalne summa n. N elemendiga jada n Leida maksimaalse summaga alamjada (Summa, EIO 15. 11. 1997)
Pikim kasvav osajada n. N elemendiga jada n Leida maksimaalse pikkusega kasvav osajada (Alamjada, EIO 06. 02. 1999)
Kahe jadaga ülesanded n Alamülesanneteks tavaliselt antud jadade prefiksid – olekuruum 2 -mõõtmeline tabel n (N-1)-prefiksid – N 2 sammuga lahendus n kõik prefiksid – N 3 või N 4 sammuga lahendus
Pikim ühine osajada n N 1 elemendiga jada n N 2 elemendiga jada n Leida maksimaalse pikkusega ühine osajada
Lühim teisendus n N 1 elemendiga jada n N 2 elemendiga jada n Lubatud operatsioonid – lisada, kustutada, asendada – 1 element korraga n Leida minimaalse sammude arvuga teisendus ühest teiseks
Läbivaatusülesanded n Olekuruum väga piiratud – K võimalikku olekut n Leiame N-ülesande olekuruumi (N-1)-ülesande olekuruumist – Üks (N-1)-ülesanne • N·K sammuga lahendus – N (N-1)-ülesannet • N 2·K sammuga lahendus
Valimised n 2 presidendikandidaati n N osariiki; K 1, K 2, . . . , KN valijameest n Iga osariik annab kõik hääled ühele kandidaadile n Kas viik on võimalik? (Valimised, EIO 13. 01. 2001)
Tabeliülesanded n Maksimaalne nullidega alamtabel n Maksimaalse summaga alamtabel
Graafiülesanded n DP info “voolab” ühes suunas n Järelikult tsükliteta graafid – puu, DAG n Vahel siiski ka muud graafid – kui ülesanne ise on monotoonne ja muudab info voolamise ühesuunaliseks
Pikim tee graafis n Pikkuse mõiste – samme/summa/korrutis n Üldjuhul NP-täielik – Hamiltoni ahel/tsükkel n DAGi korral DP (Linker, EIO 09. 03. 2002)
Lisalugemist n http: //www. ut. ee/~at/eio/ – näited, konspekt n http: //www. cs. berkeley. edu/ ~vazirani/algorithms/chap 6. pdf n http: //en. wikipedia. org/wiki/ Dynamic_programming
- Slides: 23