Dynamic Programming
Dynamic Programming splits problems into smaller overlapping subproblems and builds up solutions from base cases.
This expanded Greedy. start at a problem and you do two things. You split up the problem into smaller of the same problems and then rebuild up solving from the base case (usually trivial)
Usually finds the most optimal solution OR Count total number of solutions.
7-18 stopped on Predict the Winner, got tired of dp, come back in a week.