Tlačítka na mobilu

Problém, který v dávných dobách před vynálezem dotykového displaye řešili výrobci mobilních telefonů je formulován následovně:

  1. ▸ je dána množina symbolů S
  2. ▸ každý ze symbolů má danou váhu (frekvenci, s jakou je typicky použit v textu)
  3. ▸ symboly mají dané fixní pořadí
  4. ▸ je dán počet tlačítek k < |S|

Cílem je najít co nejlevnější rozdělení na k tlačítek. Cena za jedno tlačítko je definována jako součet:

Kde w s indexem i je cena i-tého písmene na daném tlačítku.

Hint pro dynamické řešení

Tabulky jsou fajn. Definujeme se tedy hned dvě:

  1. ▸ Ceny všech možných tlačítek - tabulka C velikosti |S|x|S|. C[i,j] je cena tlačítka, které začíná i-tým písmenkem a končí j-tým. Pod diagonálou bude prázdno. Tabulku si můžeme spočítat před začátkem výpočtu.
  2. ▸ Dynamický výpočet - tabulka D velikosti k x |S|. D[m,i] obsahuje cenu nejlepšího rozdělení tlačítek pro situaci, kdy máme m tlačítek a používáme všechny symboly až do (včetně) i-tého. Postupně tabulku vyplnujeme po řádcích - začneme s m=1.

První řádek tabulky D vlastně opíšeme z C. Potom při výpočtu m-tého řádku vždy používáme již vypočtené hodnoty z řádku m-1 a předvypočtené hodnoty z tabulky C.

Výslednou cenu optimálního rozdělení tlačítek po vyplnění celé tabulky D najdeme v D[k,|S|].

Domácí úkol

V CodExu je zadána úloha poněkud mimo probírané téma: Editační vzdálenost řetězců.