dinamikus programozás

57
Dinamikus Dinamikus programozás programozás Szlávi Péter Szlávi Péter ELTE IK ELTE IK szlavi @ ludens.elte.hu

Upload: cameo

Post on 08-Jan-2016

59 views

Category:

Documents


3 download

DESCRIPTION

Dinamikus programozás. Szlávi Péter ELTE IK [email protected]. Dinamikus programozás * tartalom. 0 Bevezetés 1 Egy gondolatébresztő példa 2 Első példázat * pénzváltás 3 Második példázat * optimális pénzváltás 4 Harmadik példázat * tükörszavak 5 Irodalom. 0Bevezetés. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dinamikus programozás

Dinamikus Dinamikus programozásprogramozás

Szlávi PéterSzlávi PéterELTE IKELTE [email protected]

Page 2: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 22/57/57

Dinamikus programozásDinamikus programozás* tartalom* tartalom

00 BevezetésBevezetés

11 Egy gondolatébresztő példaEgy gondolatébresztő példa

22 Első példázat * Első példázat * pénzváltáspénzváltás

33 Második példázat * Második példázat * optimális optimális pénzváltáspénzváltás

44 Harmadik példázat * Harmadik példázat * tükörszavaktükörszavak

55 IrodalomIrodalom

Page 3: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 33/57/57

00 BevezetésBevezetés

A lényeg:A lényeg:

Valamilyen probléma (optimális) Valamilyen probléma (optimális) megoldása úgy, hogy megoldása úgy, hogy

1.1. rekurzívan visszavezetjük rész-rekurzívan visszavezetjük rész-problémák megoldására, deproblémák megoldására, de

2.2. a rekurzió elkerülését (minimális-a rekurzió elkerülését (minimális-ra szorítását) egy táblázat ra szorítását) egy táblázat felépíté-sével, és felépíté-sével, és újrahasznosításával érjük el…újrahasznosításával érjük el…

Page 4: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 44/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

1.1 Az „iskolapélda” – 1.1 Az „iskolapélda” – pénzfelválthatóságpénzfelválthatóság

BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:FelválthatóE logikai érték – jelentése = fel- váltható-e az E a P halmazban felsorolt cím-letekkel úgy, hogy minden címletet legfeljebb egyszer használunk fel

Page 5: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 55/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

1.2 A példa „ízlelgetése” 1.2 A példa „ízlelgetése” A felváltás „szerkezetének” A felváltás „szerkezetének”

elemzéseelemzése

Egy logikus rekurzív kapcsolat:Egy logikus rekurzív kapcsolat:Tfh. felváltható az E, ekkor (1a) E = pi1

+…+pik ,

feltehető:(1b) i1<…<ik is.Ez esetben világos, hogy(2) E–pik

= pi1+…+pik-1

leírása az E–pik és {p1,…,pik-1

} paraméterek-

kel jellemzett redukált feladatnak

Page 6: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 66/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

Részproblémákra bontásRészproblémákra bontás

A felhasználható címleteket A felhasználható címleteket rögzített sorrendűnek tekintve a rögzített sorrendűnek tekintve a {p{p11,…,p,…,pii} hal-mazt egyértelműen } hal-mazt egyértelműen azonosíthatjuk azonosíthatjuk ii-vel. Így-vel. Ígybármely (rész)probléma azonosíthatóbármely (rész)probléma azonosítható az (X,i) paraméter-kettőssel, ahol X a felváltandó összeg és i a felváltáshoz felhasználható címletek utol- sójának indexe

A feladat: (E,N). A A feladat: (E,N). A (2)-ben megfogal--ben megfogal-mazott részfeladat: (E-pmazott részfeladat: (E-p iikk,i,ikk-1-1).).

Page 7: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 77/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

Rekurzív összefüggések a Rekurzív összefüggések a részproblé-mák és megoldásaik részproblé-mák és megoldásaik közöttközött (vázlatosan)(vázlatosan) FV: N FV: N N N L LFV(X,i) = Igaz, haFV(X,i) = Igaz, ha1.1. ppii=X, vagy=X, vagy

2.2. ppii<X és FV(X-p<X és FV(X-pii,i-1), vagy,i-1), vagy

3.3. FV(X,i-1)FV(X,i-1)

i. az éppen szükséges címleti. az éppen szükséges címlet

i. felhasználható és a mara-i. felhasználható és a mara-dék felváltható az előzőekkeldék felváltható az előzőekkel

i. nélkül, az előzőekkel felválthatói. nélkül, az előzőekkel felváltható

1)-iFV(X, 1i

1)-i,p-FV(X Xpi 1i

Xpi 0i

:i)FV(X, i

Page 8: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 88/57/57

Rekurzív megoldás egy lehetséges Rekurzív megoldás egy lehetséges algoritmusaalgoritmusa

type TCimletek=record db:integer; cimlet: array [1..MaxCimletDb] of integer end;var Cimletek:TCimletek; functionfunction FV( FV(constconst X X{{felváltandófelváltandó}},,

i i{{max.indexmax.index}}:integer):boolean;:integer):boolean;beginbegin FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))

////i. éppen a kellő címleti. éppen a kellő címlet

oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1)); //nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható

oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand //i. felhasználható//i. felhasználható

FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1)) //és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható

endend;;////FVFV

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

1)-iFV(X, 1i

1)-i,p-FV(X Xpi 1i

Xpi 0i

:i)FV(X, i

Page 9: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 99/57/57

Próbák – elemzések:Próbák – elemzések:a) Kis címletszám (pl. {1,2,5})

mellett „igenlő” a megoldás (pl. 8) – hívási

sorrend „tagadó” a megoldás (pl. 9) – hívási

sorrend mindkét végeredményhez olyan ada-

tok alapján, amelyben van ismétlődő címlet – hívási sorrend, hívás-szám

b) Különféle címletszám (pl. 5, 9, 15, …) mellett olyan összeg, amely azért nem váltható fel, mert túl nagy – hívás-szám növekedése

Próbáljuk ki és következtessünk! Zip, exe

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

Page 10: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1010/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))

//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));

//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand

//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))

//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……

a) tesztek

Page 11: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1111/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))

//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));

//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand

//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))

//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……

a)tesztek (folytatás)

Page 12: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1212/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

TapasztalatokTapasztalatok::A hívások módszeresen következnek egy-

másután. Akár iterációval is „utánozhat-nánk”. (Legalábbis az ismétlésmentes esetben.)

Az ismétlésmentes esetekben a hívás-szá-mok legfeljebb 1 értékűek, azaz legfeljebb egyszeres számolást jeleznek, ami a haté-konyság szempontjából megnyugtató. A 3. futásnál is még legfeljebb 2 az ismétlődő számítás, de a 4.-nél, ami alig különbözik a 3.-tól, már 4 helyen is „tripletet” látunk. S ez rosszat sejtet. kódkód

Page 13: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1313/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

A hívások során egy bináris fát „járunk be”.

Pl. a „9 összeg {1,2,5} címletekkel” futáshoz tartozó bináris fa.

kódkód

…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))

//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));

//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand

//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))

//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……

Page 14: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1414/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

b)tesztek

Page 15: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1515/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

Újabb tapasztalatokÚjabb tapasztalatok::Durván növekszik a hívás-szám (mindkét)

paraméter növekedtével..A legrosszabb (negatív végeredményű)

esetekben a hívás-számokra „gyanús” értékeket kaptunk.Állítás:

Ha RekHDb(X,i) az X összeg felbonthatósá-gához szükségez rekurzív hívások számát jelenti (i. címlettel bezárólag), akkor legked-vezőtlenebb esetben a szükséges rekurzív hívások száma:

RekHDb(X,i) = 2RekHDb(X,i) = 2ii–1–1 A hívás-szám maximumát igenlő esetben A hívás-szám maximumát igenlő esetben

is elérhetjük. Példát erre láss is elérhetjük. Példát erre láss itt!!

Page 16: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1616/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

A dinamikus programozásos megoldásA dinamikus programozásos megoldás Táblázatba gyűjtjük a részproblé-Táblázatba gyűjtjük a részproblé-mákra adott válaszokat.mákra adott válaszokat.A táblázat sorai az egyes X összegek-A táblázat sorai az egyes X összegek-hez, oszlopai az egyes phez, oszlopai az egyes p ii címletekhez címletekhez rendeli az FV(X,i) értékeket.rendeli az FV(X,i) értékeket.Éppúgy, ahogy az előbbi programnál tettünk, Éppúgy, ahogy az előbbi programnál tettünk, csakhogy ott tisztán adminisztratív, működés-csakhogy ott tisztán adminisztratív, működés-megértési céllal.megértési céllal.

A táblázatkitöltést a kis értékek felöl A táblázatkitöltést a kis értékek felöl kezdjük: hiszen az FV(X,i) rekurzió-kezdjük: hiszen az FV(X,i) rekurzió-jában FV(X,ijában FV(X,i–1–1) és FV(X) és FV(X–p–pii,i,i–1–1) szere-) szere-pel.pel.

Röviden: DP.Röviden: DP.

Page 17: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1717/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

A megoldó kód vázlata:A megoldó kód vázlata:Az sgRekTab jelenti most a táblázatot:Az sgRekTab jelenti most a táblázatot:

function PenzValtas_DinProg:boolean;begin Tablafeltoltes(Felvaltando,Cimletek.db); PenzValtas_DinProg:=sgRekTab.Cells[Cimletek.db+1, Felvaltando+2]='+';end;

Page 18: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1818/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

procedure Tablafeltoltes (const E{felváltandó}, N{max.index}:integer);

var i,x:integer;begin with fmPenzValtas do begin for x:=1 to E do begin sgRekTab.Cells[2,x+2]:='-';//első oszlop (=2 indexű) Hamis

end;//for x //kivéve az 1. cimletnél: if Cimletek.cimlet[1]<=E then //van még cimlet[1]-dik sor? begin sgRekTab.Cells[2,Cimletek.cimlet[1]+2]:='+'; end;//if …

Page 19: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1919/57/57

11 Egy gondolatébresztő Egy gondolatébresztő példapélda

… for i:=2 to N do//az i. oszlop számítása begin for x:=1 to E do begin if (Cimletek.cimlet[i]=x)

or (sgRekTab.Cells[i,x+2]='+') or ((Cimletek.cimlet[i]<x) and

(sgRekTab.Cells[i,x-Cimletek.cimlet[i]+2]='+')) then sgRekTab.Cells[i+1,x+2]:='+‘//igaz else sgRekTab.Cells[i+1,x+2]:='-'//hamis {endIf}; end;//for x end;//for i end;//withend;//Tablafeltoltes

Rekurzív hívás helyett Rekurzív hívás helyett táblahasználattáblahasználat

kódkód

…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))

//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));

//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand

//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))

//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……

Page 20: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2020/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

Összehasonlító futás:Összehasonlító futás:

Próbáljuk ki és következtessünk! Zip, exe

Page 21: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2121/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

Megjegyzések:Megjegyzések: A rekurzív megoldás fajlagos A rekurzív megoldás fajlagos

ismétlési száma: 1 048 575 / 25 267 ismétlési száma: 1 048 575 / 25 267 41 . 41 .

A DP 222 220 darab táblaelemet szá-A DP 222 220 darab táblaelemet szá-mol ki, de csak egyszer.mol ki, de csak egyszer.

A fajlagos sebesség növekedés: A fajlagos sebesség növekedés: 1 048 575 / 222 220 1 048 575 / 222 220 4,7 . 4,7 .

A „feleslegesen” kiszámolt táblaelem A „feleslegesen” kiszámolt táblaelem szám: (222 220 – 25 267) = 196 953 szám: (222 220 – 25 267) = 196 953 7,8 szorosa a szükségesnek. 7,8 szorosa a szükségesnek.

Page 22: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2222/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

Egy „okosabb” DP megoldásEgy „okosabb” DP megoldás Ötlet: ötvözni a rekurzív megoldás Ötlet: ötvözni a rekurzív megoldás célratörését, azaz „célratörését, azaz „csak azt csak azt kiszámol-ni, amit muszájkiszámol-ni, amit muszáj” elvét a ” elvét a DP megoldás „DP megoldás „mindent csak mindent csak egyszer kiszámolniegyszer kiszámolni” elvével.” elvével.Tehát a számítás logikája rekurzív Tehát a számítás logikája rekurzív marad, de mielőtt egy rekurzív marad, de mielőtt egy rekurzív hívást kezdeményeznénk, hívást kezdeményeznénk, megnézzük, nem lett-e már megnézzük, nem lett-e már kiszámolva.kiszámolva.

Page 23: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2323/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

function FV(const X,i:integer):boolean;begin if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='+') then begin FV:=true end else if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='-') then begin FV:=false end else

begin FV:=((i>0) and (Cimletek.cimlet[i]=X)) or ((i>1) and FV(X,i-1)) or ((i>1) and (Cimletek.cimlet[i]<X) and FV(X-Cimletek.cimlet[i],i-1)) end {endif};end;//FV

már ismert a '+' válasz

kódkód

már ismert a ‘-' válasz

még nem ismert a válasz

Page 24: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2424/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

Összehasonlító futás:Összehasonlító futás:

Próbáljuk ki és következtessünk! Zip, exe

Page 25: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2525/57/57

11 Egy Egy gondolatébresztő példagondolatébresztő példa

1.3 A DP módszerének váza 1.3 A DP módszerének váza 1.1. A megoldás szerkezetének A megoldás szerkezetének

tanulmányozásatanulmányozása – részproblémákra bontás – részproblémákra bontás megsejtésemegsejtése

2.2. Részproblémákra és összetevőkre bontásRészproblémákra és összetevőkre bontás– részproblémák és paramétereik körvonala-– részproblémák és paramétereik körvonala-zása: a rekurzió előkészítése zása: a rekurzió előkészítése

3.3. Részproblémák megoldásának kifejezése Részproblémák megoldásának kifejezése rekurzívan az összetevők megoldásaibólrekurzívan az összetevők megoldásaiból– formalizálás: függvény definíció– formalizálás: függvény definíció

4.4. Részproblémák megoldásának kiszámításaRészproblémák megoldásának kiszámítása – a táblaszámítás algoritmizálása– a táblaszámítás algoritmizálása1.1. kiszámítási sorrend meghatározása: minden részprob-kiszámítási sorrend meghatározása: minden részprob-

léma minden összetevője előbb szerepeljen a léma minden összetevője előbb szerepeljen a felsorolás-banfelsorolás-ban

2.2. az „alulról-felfelé” haladó számításaz „alulról-felfelé” haladó számítás

5.5. A megoldás előállítása a 4. lépésben A megoldás előállítása a 4. lépésben előállított táblázat segítségévelelőállított táblázat segítségével – a megoldás algoritmizálása– a megoldás algoritmizálása

Page 26: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2626/57/57

22 Első példázat – Első példázat – pénzváltás pénzváltás

2.1 A feladat 2.1 A feladat

BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:SP – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel

Page 27: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2727/57/57

2.2 A megoldás 2.2 A megoldás 2.2.1 2.2.1 A megoldás szerkezetének A megoldás szerkezetének

tanulmányozásatanulmányozása

Ua. mint Ua. mint korábban…

22 Első példázat – Első példázat – pénzváltás pénzváltás

Page 28: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2828/57/57

2.2.2 2.2.2 Részproblémákra és összetevők-Részproblémákra és összetevők-re bontásre bontás

A részproblémák a korábbiakhoz hason-A részproblémák a korábbiakhoz hason-lóan fogalmazhatók meg.lóan fogalmazhatók meg.

Az FV(X,i) jelentése viszont más: Az FV(X,i) jelentése viszont más: a legna-a legna-gyobb P-beli elem indexegyobb P-beli elem indexe, amely még , amely még előfordul az X felváltásában.előfordul az X felváltásában.

Pl.:Pl.:P={2,4,5} N=3; X=7, akkor S={2,5} FV(7,3)=3, mert p3=5,

FV(7-p3,3-1)=FV(7-5,3-1)=1, mert p1=2,

FV(2-p1,1-1)=FV(2-2,1-1)=FV(0,0).

22 Első példázat – Első példázat – pénzváltás pénzváltás

Page 29: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2929/57/57

2.2.3 2.2.3 Részproblémák megoldásának Részproblémák megoldásának kifejezésekifejezése

N1)-i,p-FV(XpX ha ,i

N1)-iFV(X, ha ,1)-iFV(X,

0X ha ,0

0X 0i ha ,1N

:i)FV(X,

ii

Vegyük észre, hogy akkor N+1 az ered-Vegyük észre, hogy akkor N+1 az ered-mény, ha nincs megoldás, s o, ha már mény, ha nincs megoldás, s o, ha már nem kell folytatni.nem kell folytatni.

22 Első példázat – Első példázat – pénzváltás pénzváltás

Page 30: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3030/57/57

22 Első példázat – Első példázat – pénzváltás pénzváltás

2.2.4 2.2.4 Részproblémák megoldásánakRészproblémák megoldásának kiszámítása kiszámítása

A A FV definíciójábólFV definíciójából látszik: csökkenő palátszik: csökkenő pa--raméterekhez nyúl vissza, így araméterekhez nyúl vissza, így a táblaki-táblaki-töltő számítás kis értékektől indulhat a töltő számítás kis értékektől indulhat a nagyobbak felé…nagyobbak felé…

N1)-i,p-FV(XpX ha ,i

N1)-iFV(X, ha ,1)-iFV(X,

0X ha ,0

0X 0i ha ,1N

:i)FV(X,

ii

Page 31: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3131/57/57

22 Első példázat – Első példázat – pénzváltás pénzváltás

2.2.5 2.2.5 A megoldás előállításaA megoldás előállítása

A megoldás meghatározása A megoldás meghatározása most bonyodalmasabb, mint most bonyodalmasabb, mint volt korábban: hiszen most volt korábban: hiszen most egy egy indexindexet kapunk a et kapunk a függvény ér-tékeként függvény ér-tékeként (k(k11=FV(E,N)). A táblá-zatból =FV(E,N)). A táblá-zatból kiolvasható a követke-zőé kiolvasható a követke-zőé (k(k22=FV(E–p=FV(E–pkk11,k,k11–1)), majd az –1)), majd az

azt követőé éít. Amíg a fel-azt követőé éít. Amíg a fel-váltandó összegparaméter 0-váltandó összegparaméter 0-ra nem csökken.ra nem csökken.

Rekurzív megoldás esetén persze ez Rekurzív megoldás esetén persze ez a visszalépdelés is rekurzívan a visszalépdelés is rekurzívan történne.történne.

Page 32: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3232/57/57

22 Első példázat – Első példázat – pénzváltáspénzváltás

begin//PenzValtas_DinProg Tablafeltoltes(Felvaltando,Cimletek.db); KiCimletek.db:=0; if strToInt(sgRekTab.Cells[Cimletek.db+1,Felvaltando+2])<=

Cimletek.db then begin kX:=Felvaltando; k:=Cimletek.db; while kX>0 do begin k:=strToInt(sgRekTab.Cells[k+1,kX+2]); inc(KiCimletek.db); KiCimletek.cimlet[KiCimletek.db]:=Cimletek.cimlet[k]; kX:=kX-Cimletek.cimlet[k]; dec(k); end;//while end;//ifend;//PenzValtas_DinProg

k. címlet már nem lehet, legfeljebb kisebb indexű

kX felváltásához szükséges legnagyobb címlet indexe: k

kX: a maradék összeg

van megoldás: leg-alább egy címlet

Az sgRekTab-ban az FV-értékek; a KiCimletek-ben képződik az eredmény

Page 33: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3333/57/57

DP

22 Első példázat – Első példázat – pénzváltáspénzváltás

Összehasonlító futás:Összehasonlító futás:

Próbáljuk ki és következtessünk!Rekurzív: Zip, exe; DP: Zip, exe;„okos” DP: Zip, exe.

Rekurzív

„okos” DP

Page 34: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3434/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

3.1 A feladat 3.1 A feladat

BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:SP – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel; S a lehető legkisebb elemszámú

Page 35: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3535/57/57

3.2 A megoldás 3.2 A megoldás … … és nem lehetne „mohóskodni”… ?és nem lehetne „mohóskodni”… ?

A problémánkhoz illeszkedő mohó A problémánkhoz illeszkedő mohó választás: választás: a még választhatók közül a még választhatók közül a legnagyobb címleta legnagyobb címlet. .

Egy ellenpélda: P={5,4,4,1,1,1} és Egy ellenpélda: P={5,4,4,1,1,1} és E=8; a mohó megoldás: E=8; a mohó megoldás: 8=5+1+1+1, ennél jobb: 8=4+4. 8=5+1+1+1, ennél jobb: 8=4+4.

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

Page 36: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3636/57/57

3.2.1 3.2.1 A megoldás szerkezetének A megoldás szerkezetének tanulmányozásatanulmányozása

Ua. mint korábban…Ua. mint korábban…

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

Page 37: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3737/57/57

3.2.2 3.2.2 Részproblémákra és Részproblémákra és összetevők-re bontásösszetevők-re bontás

A részproblémák a korábbiakhoz hason-A részproblémák a korábbiakhoz hason-lóan fogalmazhatók meg.lóan fogalmazhatók meg.

Két lépésben oldjuk meg a feladatot.Két lépésben oldjuk meg a feladatot.

1.1. Az Opt(X,i) jelentése: X felváltásához Az Opt(X,i) jelentése: X felváltásához szükséges (első i közül választható) szükséges (első i közül választható) címletek száma.címletek száma.

2.2. Az FV(X,i) jelentése: a legnagyobb P-Az FV(X,i) jelentése: a legnagyobb P-beli elem indexe (beli elem indexe (i), amely még elő-i), amely még elő-fordul a X felváltásában. (Építünk az fordul a X felváltásában. (Építünk az Opt-ra.)Opt-ra.)

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

Page 38: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3838/57/57

33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás

3.2.3 3.2.3 Részproblémák megoldásának Részproblémák megoldásának kifejezésekifejezése

Vegyük észre, hogy akkor N+1 az ered-Vegyük észre, hogy akkor N+1 az ered-mény, ha nincs megoldás; 0, ha célhoz mény, ha nincs megoldás; 0, ha célhoz értünk.értünk.

Xp ha ,1)iOpt(X,

Xp ha,1))iOpt(X,1),i,pOpt(XMin(1

0X ha ,0

0X 0i ha ,1N

:i)Opt(X,

i

ii

Xp ha ,1)iFV(X,1)iOpt(X,1)i,pOpt(X1 Xp ha ,i

0X ha ,00X 0i ha ,1N

:i)FV(X,

i

ii

N1)-i,p-FV(XpX ha ,i

N1)-iFV(X, ha ,1)-iFV(X,

0X ha ,0

0X 0i ha ,1N

:i)FV(X,

ii

Page 39: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3939/57/57

Egy váratlan probléma:Egy váratlan probléma:

A futás adminisztrálását végző táblapár nincs A futás adminisztrálását végző táblapár nincs szinkron-ban. Bajt okoz, hogy a bal-felső tábla (1,2) szinkron-ban. Bajt okoz, hogy a bal-felső tábla (1,2) eleme üres. Pedig az alkalmazás foglalkozott vele, eleme üres. Pedig az alkalmazás foglalkozott vele, hiszen a bal-alsó tábla (1,2) cellája helyesen 1 értéket hiszen a bal-alsó tábla (1,2) cellája helyesen 1 értéket tartalmaz.tartalmaz.

33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás

FV

Opt

Page 40: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4040/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

A probléma magyarázata:A probléma magyarázata:

Az FV definíciójának optimumra hivatko-Az FV definíciójának optimumra hivatko-zó rekurzív (3.) ágánál tartunk, zó rekurzív (3.) ágánál tartunk, „készen kapja” a döntéséhez „készen kapja” a döntéséhez szükséges informá-ciót. Ezért nem szükséges informá-ciót. Ezért nem bontogatja le sem az (X–pbontogatja le sem az (X–pii,i–1), sem az ,i–1), sem az (X,i–1) részproblémákra; (X,i–1) részproblémákra;

így a megoldás alapjául szolgáló, admi-így a megoldás alapjául szolgáló, admi-nisztratív táblázat ezen elemei kitöltet-nisztratív táblázat ezen elemei kitöltet-lenek maradnak; éslenek maradnak; és

a címleteket összeszedő részben katasz-a címleteket összeszedő részben katasz-trófát okoztrófát okoz. .

Page 41: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4141/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

A probléma megoldása:A probléma megoldása:

Az optimum kiszámításra többlet admi-Az optimum kiszámításra többlet admi-nisztrációt kell bízni: feljegyzi nisztrációt kell bízni: feljegyzi az FV-az FV-hez tartozó táblázatba hez tartozó táblázatba az általa e pil-az általa e pil-lanatban még ismert információt, hogy lanatban még ismert információt, hogy hányadik címlet szerepel a felbontás-hányadik címlet szerepel a felbontás-ban.ban.

Page 42: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4242/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

3.2.4 3.2.4 Részproblémák megoldásának Részproblémák megoldásának kiszámításakiszámítása

A táblázatgenerálás sorrendje:A táblázatgenerálás sorrendje:A címletek szerint „alulról fölfelé” A címletek szerint „alulról fölfelé” halad-va, de az érték szerint halad-va, de az érték szerint fordítvafordítva..

A fordított irány magyarázatául:A fordított irány magyarázatául: az optimumot kiszámoló függvényhez az optimumot kiszámoló függvényhez

tar-tozó táblázatot megspórolhatjuktar-tozó táblázatot megspórolhatjuk ( (nincs nincs szükség rá a végeredmény generálásáhozszükség rá a végeredmény generálásához););

mivel csak az mivel csak az előzőelőző címlet címlet oszloposzlopára ára hivat-kozik, elegendő azt és az éppen hivat-kozik, elegendő azt és az éppen számítás alatt állót megtartani, sőtszámítás alatt állót megtartani, sőt

egyetlen oszlopegyetlen oszlop is elegendő is elegendő (lenne:-)(lenne:-), ha a , ha a kiszámítás sorrendjét megfordítjukkiszámítás sorrendjét megfordítjuk..

Page 43: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4343/57/57

3 Második példázat – 3 Második példázat – optimális pénzváltásoptimális pénzváltás

3.2.5 3.2.5 A megoldás előállításaA megoldás előállítása A megoldás meghatározása most az A megoldás meghatározása most az előző-vel megegyező módon történik.előző-vel megegyező módon történik.

Page 44: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4444/57/57

33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás

az „okos” DP szokásos az „okos” DP szokásos jelzőjejelzőjeA puding próbája:A puding próbája:

Az alábbi táblázat összefoglalja a re-Az alábbi táblázat összefoglalja a re-kurzív és a memorizálós DP alkal-kurzív és a memorizálós DP alkal-mazás rekurzív hívásainak számát az mazás rekurzív hívásainak számát az {1,2,5,10,20,50,100,200,500,1000,1,{1,2,5,10,20,50,100,200,500,1000,1,2,5,10,20,50,100,200,500,1000} 2,5,10,20,50,100,200,500,1000} címletek esetén: címletek esetén:

FV + OptFV + Opt

FVFV OptOpt

E

Page 45: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4545/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

A nem optimális, rekurzív A nem optimális, rekurzív megoldásmegoldás

Összehasonlító futás:Összehasonlító futás:

Próbáljuk ki és elemezzük!Rekurzív: Zip, exe; DP: Zip, exe; „okos” DP: Zip, exe.

Az optimális, rekurzív megoldásAz optimális, rekurzív megoldás

Page 46: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4646/57/57

33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás

Megjegyzések:Megjegyzések: Kitöltött táblaelemek száma Kitöltött táblaelemek száma kicsivel kicsivel

többtöbb, mint a , mint a nemnem optimális optimális megoldást kereső esetében. (megoldást kereső esetében. (Mindkét Mindkét táblát figyelem-be véve valamivel több, táblát figyelem-be véve valamivel több, mint kétszerese.mint kétszerese.) )

FV rekurzív hívások száma FV rekurzív hívások száma minimálisminimális. . Az FV-hez tartozó táblázat kitöltését Az FV-hez tartozó táblázat kitöltését döntően az Opt függvény végzi. döntően az Opt függvény végzi.

A rekurzív hívások száma A rekurzív hívások száma kisebbkisebb az az optimumra optimumra nemnem törekvőénél. törekvőénél.

Sokkal Sokkal kevésbé nőkevésbé nő az össz rekurzív az össz rekurzív hívások száma az előbbinél. hívások száma az előbbinél.

Page 47: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4747/57/57

44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak

4.1 A feladat 4.1 A feladat

BemeneteBemenete:szó={b1,...,bN} szó – jelek sorozata

Kimenete:Kimenete:bj természetes szám – minimálisan ennyi jel beillesztésével tehető a szó palindrommá (tükörszóvá).

Page 48: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4848/57/57

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

4.2 A megoldás 4.2 A megoldás 4.2.1 4.2.1 A megoldás szerkezetének A megoldás szerkezetének

tanulmányozásatanulmányozása

TSz(S): az a szöveg, amely minimális TSz(S): az a szöveg, amely minimális számú jel beillesztésével képződik számú jel beillesztésével képződik az S-ből. az S-ből.

Ilyen biztosan van: S&S’, ahol S’ az S Ilyen biztosan van: S&S’, ahol S’ az S megfordítása.megfordítása.

Page 49: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4949/57/57

Esetek:Esetek:Ha S=Ha S=, akkor TSz(S)=, akkor TSz(S)==S.=S.Ha S egy jelből áll, akkor maga is Ha S egy jelből áll, akkor maga is

tükörszó, azaz TSz(S)=S. tükörszó, azaz TSz(S)=S. Legyen S=x&R&y, ahol x, y az S első Legyen S=x&R&y, ahol x, y az S első

és utolsó jele, és R akár üres is lehet. és utolsó jele, és R akár üres is lehet. Ha x=y, akkor TSz(S)=x&TSz(R)&y. Ha x=y, akkor TSz(S)=x&TSz(R)&y.

……

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

Page 50: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5050/57/57

44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak

…… Ha xHa xy, akkor TSz(S) első és utolsó y, akkor TSz(S) első és utolsó

jele vagy x vagy y.jele vagy x vagy y.Ha TSz(S)=x&U&Ha TSz(S)=x&U&xx, ekkor x-et szúr-, ekkor x-et szúr-

tunk be a végére, azaz U=TSz(R&y).tunk be a végére, azaz U=TSz(R&y).Ha TSz(S)=Ha TSz(S)=yy&U&y, ekkor y-t szúrtunk &U&y, ekkor y-t szúrtunk

be az elejére, azaz U=TSz(x&R).be az elejére, azaz U=TSz(x&R).

Vagyis U gyanánt (ami eggyel Vagyis U gyanánt (ami eggyel rövidebb S-nél) a TSz(R&y) és a rövidebb S-nél) a TSz(R&y) és a TSz(x&R) közül azt kell választani, TSz(x&R) közül azt kell választani, amely kevesebb beszúrással kapható amely kevesebb beszúrással kapható meg. meg.

Page 51: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5151/57/57

44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak

4.2.2 4.2.2 Részproblémákra és Részproblémákra és összetevők-re bontásösszetevők-re bontás

Jelölések:Jelölések:MSz(i,j) – a minimális jel-MSz(i,j) – a minimális jel-

beillesztések száma, és beillesztések száma, és

szó(i..j) – a szó szöveg i. és j. jele szó(i..j) – a szó szöveg i. és j. jele kö-zötti részekö-zötti része

szó(i):=szó(i..i) – a szó i. jele.szó(i):=szó(i..i) – a szó i. jele.

Page 52: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5252/57/57

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

Kapcsolatok:Ha ij, akkor nincs mit tenni.Ha i<j és

szó(i)szó(i)=szó(j), akkor jel beillesztések szó(j), akkor jel beillesztések számát az MSz(i+1,j–1) számát az MSz(i+1,j–1) részprobléma határozza meg.részprobléma határozza meg.

szó(i)szó(i)szó(j), akkor az MSz(i+1,j) és szó(j), akkor az MSz(i+1,j) és az MSz(i,j–1) közül a kisebb értékűt az MSz(i,j–1) közül a kisebb értékűt kell választanunk. kell választanunk.

A kiinduló probléma e jelölésekkel: A kiinduló probléma e jelölésekkel: MSz(1,Hossz(szó)). MSz(1,Hossz(szó)).

Page 53: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5353/57/57

4.2.3 4.2.3 Részproblémák Részproblémák megoldásának kifejezésemegoldásának kifejezése

44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak

sz(j)szó(i) ji ha ,

sz(j)szó(i) ji ha ,

ji ha ,

1))-jMSz(i,j),1,Min(MSz(i1

1)-j1,MSz(i

0

:j)MSz(i,

Page 54: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5454/57/57

4.2.4 4.2.4 Részproblémák megoldásának Részproblémák megoldásának kiszámításakiszámítása

A táblázat generálás sorrendje:A táblázat generálás sorrendje:

Az (i,j)-vel azonosított részprobléma az Az (i,j)-vel azonosított részprobléma az (i+1,j–1), az (i+1,j) és az (i,j–1) rész-(i+1,j–1), az (i+1,j) és az (i,j–1) rész-problémáktól függ. Tehát a problémáktól függ. Tehát a kiszámítási sorrend i-értelemben kiszámítási sorrend i-értelemben fogyófogyó, j-értelem-ben , j-értelem-ben növekvőnövekvő lehet. lehet.

Mivel a rekurzió során csak a közvetlen Mivel a rekurzió során csak a közvetlen szomszédra van szükség ezért szomszédra van szükség ezért elegendő elegendő egyetlen oszlopegyetlen oszlopot tárolni.ot tárolni.

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

Page 55: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5555/57/57

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

A kód lényegi része:A kód lényegi része:function TukorSzo(const s:string):integer; var T:array [1..MaxN] of integer; i,j,ment,menti:integer;begin T[1]:=0; for j:=2 to N do begin T[j]:=0; menti:=0; for i:=j-1 downto 1 do begin ment:=T[i] if s[i]=s[j] then T[i]:=menti else T[i]:=1+Min(T[i],T[i+1]); menti:=ment; end;//for i end;//for j TukorSzo:=T[1]end;//TukorSzo

MSz(1,1)0MSz(j,j)0

T(i)MSz(i,j)

MSz(i,j)MSz(i+1,j-1)

MSz(i,j)1+Min(MSz(i,j-1),MSz(i+1,j))

TukorSzoMsz(1,N)

MSzMSz

Page 56: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5656/57/57

44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak

4.2.5 4.2.5 A megoldás előállításaA megoldás előállítása

… … nem nagy kaland: nem nagy kaland:

a tábla (1,Hossz(szó)) eleme, a tábla (1,Hossz(szó)) eleme, amelyet az algoritmusbeli T vektor amelyet az algoritmusbeli T vektor első eleme tartalmaz.első eleme tartalmaz.

Page 57: Dinamikus programozás

04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5757/57/57

55 IrodalomIrodalom

[HGy] Horváth Gyula:[HGy] Horváth Gyula:„„Tehetséggondozó Program –Tehetséggondozó Program –Dinamikus programozásDinamikus programozás”, NJSzT, 2005”, NJSzT, 2005

[RISz] Rónyai L.,Ivanyos G.,Szabó R.:[RISz] Rónyai L.,Ivanyos G.,Szabó R.:Algoritmusok, TYPOTEX, 1999Algoritmusok, TYPOTEX, 1999

[SzP] Szlávi Péter:[SzP] Szlávi Péter:„„Dinamikus programozásDinamikus programozás”, kézirat”, kézirathttp://people.inf.elte.hu/szlavi/DP/http://people.inf.elte.hu/szlavi/DP/

DinamikusProgramozas.pdf DinamikusProgramozas.pdf

[SzP2] Szlávi Péter et al.: „[SzP2] Szlávi Péter et al.: „További példák aTovábbi példák adinamikus programozáshozdinamikus programozáshoz”, kézirat”, kézirathttp://people.inf.elte.hu/szlavi/http://people.inf.elte.hu/szlavi/

PrM4felev/DinaProg/ PrM4felev/DinaProg/