Understanding Dynamic Programming