Dynamic programming is a method for solving problems with overlapping sub-problems by solving each sub-problem once and storing the results. This technique, introduced by Richard Bellman, can employ either a bottom-up or a top-down approach to efficiently compute solutions. Examples of problems that can be solved using dynamic programming include Fibonacci numbers, binomial coefficients, and various optimization problems like the traveling salesman and knapsack problem.