logo

Dynamické programovanie alebo DP

Dynamické programovanie je metóda používaná v matematike a informatike na riešenie zložitých problémov ich rozdelením na jednoduchšie podproblémy. Tým, že sa každý podproblém rieši iba raz a výsledky sa ukladajú, vyhýba sa nadbytočným výpočtom, čo vedie k efektívnejším riešeniam širokého spektra problémov. Tento článok poskytuje podrobný prieskum konceptov dynamického programovania ilustrovaný príkladmi.

otvorte súbor pomocou java

Dynamické programovanie



Obsah

Čo je dynamické programovanie (DP)?

Dynamické programovanie (DP) je metóda používaná v matematike a informatike na riešenie zložitých problémov ich rozdelením na jednoduchšie podproblémy. Tým, že sa každý podproblém rieši iba raz a výsledky sa ukladajú, vyhýba sa nadbytočným výpočtom, čo vedie k efektívnejším riešeniam širokého spektra problémov.

Ako funguje dynamické programovanie (DP)?

  • Identifikujte čiastkové problémy: Rozdeľte hlavný problém na menšie, nezávislé podproblémy.
  • Riešenia predajní: Vyriešte každý podproblém a uložte riešenie do tabuľky alebo poľa.
  • Vybudovanie riešení: Použite uložené riešenia na vytvorenie riešenia hlavného problému.
  • Vyhnite sa redundancii: Uložením riešení DP zaisťuje, že každý podproblém je vyriešený iba raz, čím sa skracuje čas výpočtu.

Príklady dynamického programovania (DP)

Príklad 1: Zvážte problém nájdenia Fibonacciho sekvencie:



Fibonacciho sekvencia: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

Prístup hrubou silou:

Ak chcete nájsť n-té Fibonacciho číslo pomocou prístupu hrubej sily, jednoducho by ste pridali (n-1). a (n-2). Fibonacciho čísla. To by fungovalo, ale bolo by to neefektívne pre veľké hodnoty n , pretože by to vyžadovalo výpočet všetkých predchádzajúcich Fibonacciho čísel.



Dynamický programovací prístup:

Fibonacciho séria využívajúca dynamické programovanie

  • Podproblémy: F(0), F(1), F(2), F(3), …
  • Riešenia predajní: Vytvorte tabuľku na uloženie hodnôt F(n) pri ich výpočte.
  • Vybudovanie riešení: Pre F(n) vyhľadajte F(n-1) a F(n-2) v tabuľke a pridajte ich.
  • Vyhnite sa redundancii: Tabuľka zabezpečuje, že každý podproblém (napr. F(2)) je vyriešený iba raz.

Pomocou DP môžeme efektívne vypočítať Fibonacciho sekvenciu bez toho, aby sme museli prepočítavať podproblémy.

mb na gb

Príklad 2: Najdlhšia spoločná podsekvencia (nájdenie najdlhšej podsekvencie, ktorá je spoločná pre dva reťazce)

Príklad 3: Najkratšia cesta v grafe (nájdenie najkratšej cesty medzi dvoma uzlami v grafe)

Príklad 4: Problém s batohom (zistenie maximálnej hodnoty položiek, ktoré je možné vložiť do batohu s danou kapacitou)

Kedy použiť dynamické programovanie (DP)?

Dynamické programovanie je optimalizačná technika používaná pri riešení problémov, ktorá pozostáva z nasledujúcich charakteristík:

1. Optimálna spodná štruktúra:

Optimálna subštruktúra znamená, že kombinujeme optimálne výsledky čiastkových problémov, aby sme dosiahli optimálny výsledok väčšieho problému.

premenné typu java

Príklad:

Zvážte problém nájsť minimálne náklady cesta vo váženom grafe z a zdroj uzol do a destinácia uzol. Tento problém môžeme rozdeliť na menšie podproblémy:

  • Nájsť minimálne náklady cesta z zdroj uzol každému medziprodukt uzol.
  • Nájsť minimálne náklady cesta z každého medziprodukt uzol na destinácia uzol.

Riešenie väčšieho problému (nájdenie cesty s minimálnymi nákladmi zo zdrojového uzla do cieľového uzla) možno zostaviť z riešení týchto menších čiastkových problémov.

2. Prekrývajúce sa čiastkové problémy:

V rôznych častiach problému sa opakovane riešia rovnaké podproblémy.

Príklad:

Zvážte problém s výpočtom Fibonacciho séria . Na výpočet Fibonacciho čísla v indexe n , musíme vypočítať Fibonacciho čísla v indexoch n-1 a n-2 . To znamená, že čiastkový problém výpočtu Fibonacciho čísla na indexe n-1 sa používa dvakrát pri riešení väčšieho problému výpočtu Fibonacciho čísla v indexe n .

Prístupy dynamického programovania (DP)

Dynamické programovanie je možné dosiahnuť dvoma spôsobmi:

1. Prístup zhora nadol (zapamätanie):

V prístupe zhora nadol, známom aj ako zapamätanie , začneme s konečným riešením a rekurzívne ho rozložíme na menšie podproblémy. Aby sme sa vyhli nadbytočným výpočtom, ukladáme výsledky vyriešených čiastkových úloh do memoizačnej tabuľky.

Poďme si rozobrať prístup zhora nadol:

  • Začína sa konečným riešením a rekurzívne ho rozdeľuje na menšie čiastkové problémy.
  • Ukladá riešenia čiastkových problémov do tabuľky, aby sa predišlo nadbytočným výpočtom.
  • Vhodné, keď je počet čiastkových problémov veľký a mnohé z nich sa znovu používajú.

2. Prístup zdola nahor (tabuľka):

V prístupe zdola nahor, známom aj ako tabelácia , začíname od najmenších čiastkových problémov a postupne sa dostávame ku konečnému riešeniu. Výsledky vyriešených podproblémov ukladáme do tabuľky, aby sme sa vyhli nadbytočným výpočtom.

Poďme si rozobrať prístup zdola nahor:

Počet sql odlišný
  • Začína sa od najmenších čiastkových problémov a postupne sa dostáva ku konečnému riešeniu.
  • Vyplní tabuľku riešeniami podproblémov zdola nahor.
  • Vhodné, keď je počet podproblémov malý a optimálne riešenie možno priamo vypočítať z riešení menších podproblémov.

Dynamické programovanie (DP) Algoritmus

Dynamické programovanie je algoritmická technika, ktorá rieši zložité problémy tak, že ich rozdelí na menšie čiastkové problémy a ich riešenia uloží pre budúce použitie. Je obzvlášť účinný pri problémoch, ktoré obsahujú prekrývajúce sa čiastkové problémy a optimálna spodná konštrukcia.

Bežné algoritmy, ktoré používajú dynamické programovanie:

  • Najdlhšia spoločná sekvencia (LCS): Nájde najdlhšiu spoločnú podsekvenciu medzi dvoma reťazcami.
  • Najkratšia cesta v grafe: Nájde najkratšiu cestu medzi dvoma uzlami v grafe.
  • Problém s batohom: Určuje maximálnu hodnotu položiek, ktoré je možné umiestniť do batohu s danou kapacitou.
  • Násobenie maticového reťazca: Optimalizuje poradie násobenia matíc, aby sa minimalizoval počet operácií.
  • Fibonacciho sekvencia: Vypočíta n-té Fibonacciho číslo.

Výhody dynamického programovania (DP)

Dynamické programovanie má širokú škálu výhod, medzi ktoré patria:

  • Zabraňuje viacnásobnému prepočítavaniu rovnakých čiastkových problémov, čo vedie k výraznej úspore času.
  • Zabezpečuje nájdenie optimálneho riešenia zvážením všetkých možných kombinácií.
  • Rozdeľuje zložité problémy na menšie, lepšie zvládnuteľné podproblémy.

Aplikácie dynamického programovania (DP)

Dynamické programovanie má širokú škálu aplikácií, vrátane:

  • Optimalizácia: Problém s batohom, problém s najkratšou cestou, problém s maximálnym podpolím
  • Počítačová veda: Najdlhšia spoločná podsekvencia, vzdialenosť úprav, párovanie reťazcov
  • Operačný výskum: Riadenie zásob, plánovanie, alokácia zdrojov

Teraz preskúmame komplexný plán na zvládnutie dynamického programovania.

Naučte sa základy dynamického programovania (DP)

Pokročilé koncepty dynamického programovania (DP)

  • Bitové maskovanie a dynamické programovanie | Set 1
  • Bitové maskovanie a dynamické programovanie | Sada 2 (TSP)
  • Číslica DP | Úvod
  • Súčet cez podmnožiny | Dynamické programovanie

Dynamické programovanie (DP) Problémy

Štandardné problémy dynamického programovania (DP) sme klasifikovali do troch kategórií: ľahké, stredné a ťažké.

1. Jednoduché problémy s dynamickým programovaním (DP)

  • Fibonacciho čísla
  • n-té katalánske číslo
  • Čísla zvonov (počet spôsobov, ako rozdeliť sadu)
  • Binomický koeficient
  • Problém s výmenou mincí
  • Problém podmnožiny súčtu
  • Vypočítajte nCr % p
  • Rezanie tyče
  • Algoritmus maľovania plotu
  • Najdlhšia spoločná sekvencia
  • Najdlhšia rastúca následná sekvencia
  • Najdlhšia podsekvencia taká, že rozdiel medzi susedmi je jedna
  • Maximálna veľkosť štvorcovej podmatice so všetkými 1
  • Cesta minimálnych nákladov
  • Minimálny počet skokov na dosiahnutie konca
  • Najdlhší spoločný podreťazec (riešenie DP optimalizované pre priestor)
  • Spočítajte spôsoby, ako sa dostať na n-tý schodík pomocou kroku 1, 2 alebo 3
  • Spočítajte všetky možné cesty od ľavého horného rohu po pravý spodný okraj matice mXn
  • Jedinečné cesty v mriežke s prekážkami

2. Stredné problémy dynamického programovania (DP)

  • Algoritmus Floyda Warshalla
  • Bellman-Fordov algoritmus
  • 0-1 Problém s batohom
  • Tlač položiek v 0/1 batohu
  • Neohraničený batoh (opakovanie položiek povolené)
  • Puzzle na kvapkanie vajíčok
  • Problém zlomu slov
  • Problém krytu vertexu
  • Problém so stohovaním dlaždíc
  • Problém stohovania krabičiek
  • Problém s oddielmi
  • Problém obchodného cestujúceho | Sada 1 (naivné a dynamické programovanie)
  • Najdlhšia palindromická sekvencia
  • Najdlhšia spoločná rastúca podsekvencia (LCS + LIS)
  • Nájdite všetky rozdielne súčty podmnožín (alebo podsekvencií) poľa
  • Vážené plánovanie úloh
  • Počítajte odchýlky (permutácia taká, že žiadny prvok sa neobjaví na svojej pôvodnej pozícii)
  • Minimálne vloženia na vytvorenie palindrómu
  • Zhoda vzoru zástupných znakov
  • Spôsoby usporiadania guľôčok tak, aby susedné gule boli rôznych typov

3. Ťažké problémy dynamického programovania (DP)

  • Rozdelenie palindrómu
  • Problém zalamovania slov
  • Problém maliarovej priečky
  • Program na riešenie problémov s mostom a pochodňou
  • Násobenie maticového reťazca
  • Tlač zátvoriek v probléme násobenia maticového reťazca
  • Obdĺžnik maximálneho súčtu v 2D matici
  • Maximálny zisk nákupom a predajom podielu najviac k-krát
  • Minimálne náklady na triedenie reťazcov pomocou operácií obrátenia rôznych nákladov
  • Počet AP (aritmetická progresia) subsekvencií v poli
  • Úvod do dynamického programovania na stromoch
  • Maximálna výška stromu, keď sa ktorýkoľvek uzol môže považovať za koreň
  • Najdlhší opakujúci sa a neprekrývajúci sa podreťazec

Rýchle odkazy:

  • Naučte sa dátovú štruktúru a algoritmy | Príručka DSA
  • 20 najčastejších otázok na pohovor o dynamickom programovaní
  • „Problémy s cvičením“ dynamického programovania
  • „Kvíz“ o dynamickom programovaní