Dynamic Programming : Dynamic programming is a technique for solving problems by breaking them down into smaller subproblems, solving each subproblem once, and storing the solution to each subproblem so that it can be reused in the future. Some characteristics of dynamic programming include: Optimal substructure: Dynamic programming problems typically have an optimal substructure, meaning that the optimal solution to the problem can be obtained by solving the subproblems optimally and combining their solutions. Overlapping subproblems: Dynamic programming problems often involve overlapping subproblems, meaning that the same subproblems are solved multiple times. To avoid solving the same subproblem multiple times, dynamic programming algorithms store the solutions to the subproblems in a table or array, so that they can be reused later. Bottom-up approach: Dynamic programming algorithms usually solve problems using a bottom-up approach, meaning that they start by solving the smallest subproblems and work their way up to the larger ones. Efficiency: Dynamic programming algorithms can be very efficient, especially when the subproblems overlap significantly. By storing the solutions to the subproblems and reusing them, dynamic programming algorithms can avoid redundant computations and achieve good time and space complexity. Applicability: Dynamic programming is applicable to a wide range of problems, including optimization problems, decision problems, and problems that involve sequential decisions. It is often used to solve problems in computer science, operations research, and economics. Algorithm Design Techniques Iterative techniques, Divide and Conquer, Dynamic Programming, Greedy Algorithms.