Repetytorium - Ćwiczenia 10


Poprzednie Następne
Temat: Programowanie dynamiczne.

Programowanie dynamiczne

Jeżeli podproblemy, na które został podzielony problem główny, nie są niezależne to w różnych podproblemach wykonywane są wiele razy te same obliczenia, warto jest wtedy zastosować ulepszenie tej metody- programowanie dynamiczne. Wyniki obliczeń są zapamiętywane w tablicy pomocniczej, która jest wykorzystywana w kolejnych krokach algorytmu, co eliminuje potrzebę wielokrotnego wykonywania tych samych obliczeń. Prowadzi to do widocznego obniżenia złożoności obliczeniowej. Przykładem może być obliczanie symbolu Newtona. Rekurencyjna funkcja wyznaczająca ten współczynnik ma złożoność wykładniczą. Po zastosowaniu programowania dynamicznego złożoność maleje do O(n2). Programowanie dynamiczne polega więc na wykonania obliczeń każdego podproblemu tylko raz i zapamiętaniu jego wyniku w tabeli. W każdym kolejnym kroku można z tej tabeli korzystać. Programowanie dynamiczne jest zazwyczaj stosowane w rozwiązywaniu problemów optymalizacyjnych, prowadzi to często do wyznaczenia kilku równoznacznych, optymalnych rozwiązań. Taka metoda tworzenia algorytmów znalazła zastosowanie m.in. w rozwiązywaniu problemu plecakowego, w optymalnym mnożeniu ciągu macierzy. Jest także stosowana w automatach do kawy przy wydawaniu reszty w taki sposób, my monet było najmniej.  (http://www.algorytm.org/kurs-algorytmiki/programowanie-dynamiczne.html)

Zadanie 1 - ciąg Fibonacciego

Napisz program znajdujący n-ty element ciągu Fibonacciego. Rozwiąż zadanie na dwa sposoby:
1) rekurencyjnie
2) za pomocą tablicy - i przechowując wszystkie dotychczas znalezione wartości.

Zadanie 2 - Współczynnik dwumianowy Newtona

Napisz program umożliwiający obliczenie (n po k) - symbolu newtona. (za pomocą programowania dynamicznego)