- when a problem can be broken down into overlapping subproblems (same subproblem appears many times)
- when the problem has optimal substructure (optimal solution can be built from optimal solutions of subproblems)
- Fibonacci sequence
- Knapsack problem
- Longest common subsequence
- solve subproblems once and store their results.
- avoid recomputing the same subproblem over and over.
- time complexity is usually polynomial (much better than exponential brute force)
- space complexity can be optimized (e.g., keep only last two rows instead of full table).