10 - Dynamické programování II
Připomenutí teorie
Přednášky 10 a 11 v oddíle Přednášky.
Nejdelší rostoucí podposloupnost
V této úloze nás zajímá sekvence (ne nutně sousedících) prvků v poli, taková, že každý prvek nalevo je menší než každý prvek napravo.
Uvážíme úlohu jako hledání nejdelší podposloupnosti ke které můžeme připojit poslední prvek pole a tak vytvořit kandidáta na nejdelší posloupnost celkově. Když známe rostoucí podposloupnosti všech délek pro zkrácené pole (pole bez posledního prvku) můžeme z nich vybrat nejdelší posloupnost, která končí menším číslem. Připojením našeho prvku vznikne posloupnost o 1 delší, kterou si zapamatujeme, pokud končí nižším číslem než posloupnost stejné délky, pokud takovou už máme uloženou. Toto využití řešení menšího problému je ta “optimal substructure”. Nalezené podposloupnosti budou využity i pro přidávání dalšího prvku, tedy máme “overlapping subproblems”.
Stačí si zapamatovat tyto výsledky a dočasné podposloupnosti a jsme schopni vyřešit úlohu v , jelikož procházíme prvků a vždy hledáme nejdelší posloupnost končící menším číslem, což můžeme dělat půlením intervalu.
Nejvýhodnější závorkování součinu matic
V této úloze máme několik matic rozdílných rozměrů v daném pořadí které chceme pronásobit. Záleží nám na pořadí provedení jednotlivých násobení - na uzávorkování součinu, které povede k minimu operací. Pro a bude složitost násobení rovna .
Jedno velké násobení matic si představíme jako možných násobení 2 matic podle toho jak rozdělíme matic na 2 části jejichž složitost násobení umíme snadno spočítat. Ty 2 části jsou naše “optimal substructure” a to, že mnoho z onich rozdělení využijeme vícekrát ukazuje na “overlapping subproblems”.
Složitost najití optimálního uzávorkování bude . Odvození viz přednáška, ale odhad lze udělat z toho, že vyplňujeme polovinu tabulky a každé číslo dosazujeme hledáním maxima z až výpočtů.
Řešené úlohy
Rostoucí podposloupnost
Řešená úloha 1: Najděte nejdelší rostoucí podposloupnost dané posloupnosti. Použijte metodu dynamického programování, napište tabulku průběžných délek částečných výsledků a tabulku předchůdců
5 |
8 |
11 |
13 |
9 |
4 |
1 |
2 |
0 |
3 |
7 |
10 |
12 |
6 |
Řešení
index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
hodnota |
5 |
8 |
11 |
13 |
9 |
4 |
1 |
2 |
0 |
3 |
7 |
10 |
12 |
6 |
předek |
- |
0 |
1 |
2 |
1 |
- |
- |
6 |
- |
7 |
9 |
10 |
11 |
9 |
délky podposloupnosti |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
index posledního prvku |
8 |
7 |
9 |
13 |
11 |
12 |
- |
poslední prvek |
0 |
2 |
3 |
6 |
10 |
12 |
- |
Délka výsledné sekvence je 6 a sekvence (dle vektoru předků) je 1, 2, 3, 7, 10, 12.
Závorkování Matic
Řešená úloha 2: Rozměry matic jsou po řadě: , , , , . Určete pomocí dynamického programování, jak uzávorkovat součin , aby počet operací násobení dvou čísel během výpočtu celého součinu byl co nejmenší. Kolik to bude operací?
Řešení
Postupujeme vyplňováním počtu operací do tabulky jako je níže, dolní index jsou rozměry matice která je výsledkem násobení.
Vyplňujeme od diagonály směrem doprava nahoru.
A |
B |
C |
D |
E |
|
A |
|||||
B |
- |
||||
C |
- |
- |
|||
D |
- |
- |
- |
||
E |
- |
- |
- |
- |
Výsledek lze rekonstruovat, když si pamatujeme informaci o tom které pozice jsme využili pro výpočet minima v každé buňce:
1 |
2 |
3 |
4 |
5 |
|
A |
B |
C |
D |
E |
|
A |
2 |
||||
B |
- |
2 |
2 |
4 |
|
C |
- |
- |
4 |
||
D |
- |
- |
- |
4 |
|
E |
- |
- |
- |
- |
Každý uložený index lze interpretovat jako index poslední matice která bude uzávorkovaná v levé závorce, zbytek bude napravo.
Další úlohy
Nejdelší rostoucí podposloupnost
💻 Úloha 3: Naimplementujte řešení hledání nejdelší rostoucí podposloupnosti.
Úloha 4: Najděte nejdelší rostoucí podposloupnost dané posloupnosti. Použijte metodu dynamického programování, napište tabulku průběžných délek částečných výsledků a tabulku předchůdců.
6 |
7 |
5 |
15 |
10 |
9 |
11 |
18 |
19 |
8 |
12 |
1 |
3 |
4 |
13 |
14 |
0 |
17 |
2 |
16 |
Úloha 5:
Určete, jak lze využít nebo přizpůsobit metodu hledání nejdelší rostoucí podposloupnosti pro hledání:
a) nejdelší klesající podposloupnosti,
b) nejdelší neklesající podposloupnosti,
c) nejdelší konstantní podposloupnosti,
d) nejdelší alternující posloupnosti. (V alternující posloupnosti platí , pro )
Závorkování matic
⚡ Úloha 6: Kolika různými způsoby lze uzávorkovat součin matic? (Různé způsoby závorkování odpovídají různému průběhu výpočtu a obecně různým mezivýsledkům. Závorkování a pokládáme za totožné.)
Co v obecném případě matic? Zkuste formulujte algoritmus DP který to spočítá pro dané .
Výsledek
Mělo by to být
Úloha 7:
Určete, pro které hodnoty je výhodnější vypočítat součin než vypočítat součin .
⭐ Úloha 8: Rozměry matic jsou stejné jako v úloze 2 (popořadě , , , , ). Z důvodů např. testování HW/SW si přejeme součin uzávorkovat tak, aby počet operací násobení dvou čísel byl co největší.
Rozhodněte, zda lze metodu hledání co nejvýhodnějšího uzávorkování přizpůsobit pro řešení této modifikované úlohy. Jaký bude algoritmus řešení?
Ostatní úlohy
⭐ Úloha 9: V dané matici začneme kdekoli v prvním sloupci a dále vždy postupujeme jen ve směru SV, V, JV až kamkoli do posledního sloupce. Cena cesty je součet hodnot navštívených polí. Jaká může být nejmenší?
29 |
10 |
11 |
23 |
22 |
23 |
27 |
25 |
29 |
12 |
29 |
24 |
18 |
21 |
11 |
27 |
14 |
24 |
30 |
17 |
26 |
29 |
23 |
22 |
12 |
25 |
23 |
13 |
28 |
16 |
20 |
24 |
10 |
14 |
30 |
15 |
Co když cena za cestu bude součet absolutních hodnot rozdílů cen sousedních navštívených polí?