Solve complex problems by breaking them into overlapping subproblems — memoize results for exponential speedups.
Five passes over the same idea, each from a different angle. Do them in order, or jump to whichever you need.
Dynamic programming (DP) solves optimization problems by identifying overlapping subproblems and optimal substructure. Top-down (memoization) adds caching to recursion. Bottom-up (tabulation) builds solutions iteratively. Classic patterns include 0/1 knapsack, longest common subsequence, coin change, and edit distance.