Dynamic Programming
Break down the problem into a collection of simpler subproblems
Solve each of those subproblems just once, and storing their solutions.
The next time the same subproblem occurs, instead of recomputing its solution, one simply looks up the previously computed solution
Thereby save computation time at the expense of storage space.