Dynamic programming refers to the practice of recursively breaking down a problem into sub-problems in order to simplify a problem.
Dynamic programming is a programming design pattern also referred to as a method that stores the results of overlapping sub-problems in order to simplify calculating a more complex result, or finding an optimal solution.
It is brute force but with optimisations to prevent repeats
It requires overlapping subproblems to be advantageous. It trades decreased time complexity (reduce need for recalculation) for increased space complexity (storage needed to store obtained solutions to subploblems).
Examples Floyd warshall