Solving a problem by combining answers to smaller subproblems, each solved once and stored.

A problem fits when it has optimal substructure and overlapping subproblems. You define a state, a transition, base cases and an order, then fill a table or memoize a recursion.