Personally, I think dynamic programming is very important for a coder. This is not a specific skill but a kind of idea or method of thinking. This helps you get a global optimal result step by step from the easiest condition to the current condition, which is the task we need to solve.
What I have said is just the traits and features of Dynamic Programming, but about the nature of it, we have to state it clearer.
State is actually the discrete cases, from the easiest condition to the hardest one, or the cases will not have any order, then we cannot step by step know the next case.
The first step of establishing Dynamic Programming is to define the states of the problem, then we can proceed to connect the states together.
State transform function means step by step connection of discrete cases, which is a certain rule or order.
So the second step is to find the connections between the cases, then we can step by step find the result we need.
I would separate usaco 1.1 and 51nod state 1 later, list all the problems here to make an analysis here, hope you all like it.