Dynamic programming is an optimization strategy which allows to solve complex problems by transforming them into subproblems and by taking advantage of the subproblems overlap in order to reduce the number of operations . When facing with complex recursive problems, by using dynamic programming we solve each different subproblem only once by storing the solution for subsequent use. If during the recursion the same subproblem is encountered again, the problem is not solved twice since its solution is already available. Such a re-use of previously solved subproblems is often referred in literature as memorization algorithm [1]}. Intuitively, DP allows to reduce the complexity of problems with a structure, such that the solutions of the same subproblems can be reused many times.
