Dynamic programming is a technique of solving a problem by first solving
        the smallest version of that problem, and using that result to solve
        the next smallest version, until arriving at the original problem.
      
      
        For example, to calculate the
        
factorial
        of 5, first get the factorial of 1, which is given, and multiply that by
        2 to get the factorial of 2. Then multiply that result by 3 to get the
        factorial of 3, etc.