introduction to dynamic programming properties of dynamic programming how to solve dynamic programming problems