There is already plenty of excellent material on the internet about dynamic programming, and some of our NOI participants are already familiar with DP. If you still don't know what the fuss is all about, read on. Check out the following videos from MIT to get you started.

DP is seriously one of the coolest things in algorithms, so you have to learn it. What makes it so cool is that with just a little bit of effort, it is suddenly possible to transform exponential time algorithms into polynomial time algorithms. It is also an interesting combination of being formulaic while requiring creativity.

What DP is all about can be summarized in the following equation:

$$$$\mathit{DP} = \mathit{brute\,\,force} + \mathit{memoization}$$$$

That's all there is to it. First you need to see a few classic DP problems before what's written below will make sense. So here you go. Come back after you've read items 1-14, 27, and 55.