Design Patterns in Dynamic Programming