Algorithms that break a problem into smaller subproblems but avoid solving the same subproblem twice.