Dynamic Programming
First, think of solution as a linear sequence of decisions.
Second, work backward from the last decision to see: how a decision depends on previous decisions.
Third, introduce some notation to express the recursive relation,
Fourth, generate condition, find out boundary condition, find out how to do iteration
Typical problem: knapsack, longest common subsequence...