Memoizing/Dynamic Programming
Define problem in terms of smaller subproblems
Solve and record solution for base cases
Build solutions for subproblems up from solutions to smaller subproblems
Can improve runtime of divide & conquer algorithms that have shared subproblems with optimal substructure.
Usually involves a table of subproblem solutions.