how to do dynamic programming