What is dynamic programming?