Principles of dynamic programming part 1