10. Dynamické programování II

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 O(nlogn)\mathrm{O}(n \log n), jelikož procházíme nn 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 ARr×mA \in \mathbb{R}^{r \times m} a BRm×cB \in \mathbb{R}^{m \times c} bude složitost násobení ABA B rovna rmcr \cdot m \cdot c.

Jedno velké násobení nn matic si představíme jako n1n-1 možných násobení 2 matic podle toho jak rozdělíme nn 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 Θ(n3)\Theta(n^3). Odvození viz přednáška, ale odhad lze udělat z toho, že vyplňujeme polovinu tabulky n×nn \times n a každé číslo dosazujeme hledáním maxima z až nn 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 A,B,C,D,EA, B, C, D, E jsou po řadě: 2×52\times 5, 5×35 \times 3, 3×63 \times 6, 6×26 \times 2, 2×42 \times 4. Určete pomocí dynamického programování, jak uzávorkovat součin A×B×C×D×EA \times B \times C \times D \times E, 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

02×50_{2\times5}

302×330_{2\times3}

662×666_{2\times 6}

782×278_{2\times 2}

942×494_{2\times 4}

B

-

05×30_{5\times3}

905×690_{5\times 6}

665×266_{5\times 2}

1065×4106_{5\times 4}

C

-

-

03×60_{3\times6}

363×236_{3\times 2}

603×460_{3\times 4}

D

-

-

-

06×20_{6\times2}

486×448_{6\times 4}

E

-

-

-

-

02×40_{2\times4}

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

0\color{#3f00ff}0

1\color{#8f00ff}1

2

2\color{#bf00ff}2

4\color{#ff00ff}4

B

-

0\color{#3f00ff}0

2

2

4

C

-

-

0\color{#3f00ff}0

3\color{#8f00ff}3

4

D

-

-

-

0\color{#3f00ff}0

4

E

-

-

-

-

0\color{#bf00ff}0

Každý uložený index lze interpretovat jako index poslední matice která bude uzávorkovaná v levé závorce, zbytek bude napravo.

((A×B)×(C×D)×E)((A \times B) \times (C \times D) \times E)


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 a1,a2,ana_1, a_2, \ldots a_n platí (akak1)(ak+1ak)<0(a_k - a_{k-1}) \cdot (a_{k+1} - a_k) < 0, pro k=2,3,n1k = 2, 3, \ldots n-1)


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í (X)(X) a ((X))((X)) pokládáme za totožné.)

  • A×B×C×DA \times B \times C \times D

  • A×B×C×D×EA \times B \times C \times D \times E

Co v obecném případě nn matic? Zkuste formulujte algoritmus DP který to spočítá pro dané nn.

Výsledek

Mělo by to být (2nn+1)=nn+1(2nn)\binom{2n}{n+1} = \frac{n}{n+1}\binom{2n}{n}


Úloha 7:

Určete, pro které hodnoty nn je výhodnější vypočítat součin (A×B)×C(A \times B) \times C než vypočítat součin A×(B×C)A \times (B \times C).

  • ARn×2,BR2×3,CR3×4A \in R^{n \times 2} , B \in R^{2 \times 3} , C \in R^{3 \times 4}

  • AR5×n,BRn×4,CR4×nA \in R^{5 \times n} , B \in R^{n \times 4} , C \in R^{4 \times n}

  • ARn×n,BRn×100,CR100×nA \in R^{n \times n} , B \in R^{n \times 100} , C \in R^{100 \times n}


Úloha 8: Rozměry matic A,B,C,D,EA, B, C, D, E jsou stejné jako v úloze 2 (popořadě 2×52\times 5, 5×35 \times 3, 3×63 \times 6, 6×26 \times 2, 2×42 \times 4). 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í?


Je na stránce chyba?

Nahlašte nám ji

Máte otázky nebo připomínky?

Edit Dejte nám vědět