# Hint Latihan Dynamic Programming
## A - Recursion: Davis' Staircase
Misalkan $f(n)$ adalah banyaknya cara menuju ke anak tangga ke-n
Asumsi dia berada di lantai dan bisa dianggap anak tangga ke-0
Untuk sampai pada anak tangga ke-n, ada 3 kemungkinan :
* loncatan terakhir sejauh 1, artinya ia perlu pergi ke anak tangga ke-(n-1) dulu -> banyak cara = $f(n-1)$
* loncatan terakhir sejauh 2, artinya ia perlu pergi ke anak tangga ke-(n-2) dulu -> banyak cara = $f(n-2)$
* loncatan terakhir sejauh 3, artinya ia perlu pergi ke anak tangga ke-(n-3) dulu -> banyak cara = $f(n-3)$
Sehingga,
$f(n) = f(n-1)+f(n-2)+f(n-3)$
$f(0) = 1$
$f(1) = 1$
$f(2) = 2$
## B - The Triangle
Perhatikan array untuk menampung segitiga bilangan
```
a[1][1]
a[2][1] a[2][2]
a[3][1] a[3][2] a[3][3]
a[4][1] a[4][2] a[4][3] a[4][4]
....
a[n][1] a[n][2] a[n][3] . . . a[n][n]
```
Misal $f(n,m)$ adalah total bilangan maksimal yg diperoleh jika kita mulai dari bilangan di baris $n$ dan kolom $m$ atau posisi $(n,m)$
Dari posisi $(n,m)$ kita akan mendapatkan bialngan $a[n][m]$ dan bisa loncat ke 2 tempat :
* Jika loncat ke posisi $(n+1,m)$, maka berikutnya kita akan mendapatkan total maksimal $f(n+1,m)$
* Jika loncat ke posisi $(n+1,m+1)$, maka berikutnya kita akan mendapatkan total maksimal $f(n+1,m+1)$
Sehingga,
$f(n,m) = a[n][m] + max(f(n+1,m), f(n+1,m+1))$
jika n baris terakhir, maka $f(n,m) = a[n][m]$
## C - Typical Stairs
Misal $f(n)$ = banyaknya cara ke pijakan ke-n
Jika pijakan ke-n rusak, maka
$f(n) = 0$
Jika pikanan ke-n tidak rusak, maka
$f(n) = f(n-1) + f(n-2)$
## D - Mashmokh and ACM
Misal $f(n, k)$ = banyaknya barisan sepanjang k yang suku terakhirnya adalah n
Perhatikan bahwa suku kedua terakhir haruslah faktor dari n. Untuk melengkapinya, kita perlu membuat barisan sepanjang k-1 dengan suku terakhirnya adalah faktor dari n.
$f(n, k) = f(d_1, k-1) + f(d_2, k-1) + f(d_3, k-1)...$
dimana $d_1, d_2, d_3, ...$ adalah faktor dari n