## dynamic programming

<br>

* take a recursive algorithm and cache overlapping problems (repeated calls).
* the runtime is given by the number of calls.
* **top-down**: how can we divide the problem into sub-problems?
    * top-down dynamic programming is called **memoization**.
* **bottom-up**: solve for a simple case, then figure out for more elements.

<br>