Princip dynamického programování

  • Začneme s rekurzivním pomalým algoritmem
  • Analyzujeme ho pro opakované výpočty
  • Pořídíme si tabulku a budeme si v ní pamatovat, které podproblémy jsme již vyřešili. Tedy počítáme si cache.
  • Odstraníme rekurzi a zvolíme vhodné pořadí podproblémů. Cache a odstranění rekurze zrychlí běh algoritmu.

Nejdelší rostoucí podposloupnost

Dostaneme posloupnost celých čísel a chceme vymazat co nejméně prvků, aby nám zbyla jen a pouze rostoucí podposloupnost. Hladový algoritmus můžeme postavit na algoritmu NRP, který má ale složitost .

Můžeme si ale pomocí návodu udělat lepší algoritmus, budeme počítat tabulku a postupně vyplňovat od největšího indexu k nejmenšímu. Chceme , což bude délka té nejdelší podposloupnosti začínající .

Algoritmus běží v a jeho korektnost je dokazatelná induktivně dle . Stačí si povšimnout, že začíná-li optimální řešení pro vstup dvojicí , pak z něj odebráním vznikne optimální řešení pro , tedy máme optimální substrukturu, protože existujíc lepší řešení pro kratší vstup tak bychom narazili na rozpor, protože by to bylo lepší řešení i pro vstup větší.

Zároveň díky můžeme vytrasovat jaké prvky jsou součástí podposloupnosti a sice, první je , druhý atd.


Editační vzdálenost

Editační operací na řetězci nazveme vložení, smazání nebo změnu jednoho znaku. Editační vzdálenost řetězců a udává, kolik nejméně editačních operací je potřeba, abychom z prvního řetězce vytvořili druhý. Značeno .

  • Pokud , můžeme první znak ponechat beze změny. Tehdy
  • Znak změníme na . Pak .
  • Znak smažeme. Tehdy .
  • Na začátek vložíme . Tehdy Pokaždé závisí na vzdálenostech nějakých suffixů .

Použitím principu dynamického programování spočteme tabulku odzadu, kde se tabulka bude chovat jako matice a každý prvek záleží na prvku vpravo dole od něj samotného.

Algoritmus běží v čase a správnost je dokazatelná indukcí na délkách řetězců a pozorování o změnách editační vzdálenosti.