A good percentage of the problems on UVA can be solved using dynamic programming (DP for short) so being familiar with the various ways to solve such problems is important.
Solving more of such problems is the best way to get better at it. Eventually you'll notice some pattern of similarity in DP problems, typically some kind of optimization or combinatorics problem which can be formulated in a recursive fashion.
Another approach to thinking about DP problems is given by Prof Kirk Pruhs at http://www.cs.pitt.edu/~kirk/papers/dynprog.ps
Using a DP algorithm involves modelling the problem in terms of a recurrence relation of an objective function
Usually there are several ways to formulate the given problem statement for DP, it is worthwhile to do a quick analysis of the complexity of the method you intend to use before actually coding it out. The complexity of a DP algorithm is roughly number of entries in the DP table x time taken to compute an entry.
If the given parameter n at most 2000, an O(n2) DP method might make it in time but an O(n3) algorithm will most likely get time limit exceeded (TLE) unless you are certain that the worst case never happens.
Some common approaches to reduce the time complexity are:
Another problem that can arise is when your DP consists of too many variables (normally known as the curse of dimensionality) and you need an extremely large array to hold all the computed values and this leads to memory limit exceeded (MLE) on the online judge
Some common approaches to reduce the memory needed are: