Dynamic Programming
Dynamic Programming is less of a static "algorithm" and more of just a method for solving a type of problem in an efficient way.
The problems this applies to are those recursive in nature, where we can break down the problem into sub-problems, and we’re repeatedly calculating solutions for subproblems.
The basic idea is to store the results of subproblems so we don’t have to recompute them (or traverse that level of the problem tree again).
Methods for storing these results for subproblems are either Memoization or Tabulation.