Human: Summarise provided text and transform it into cards. Every card should contain a question and a short answer.

Dynamic programming approach is similar to divide and conquer in breaking down the problem into smaller and yet smaller possible sub-problems. But unlike, divide and conquer, these sub-problems are not solved independently. Rather, results of these smaller sub-problems are remembered and used for similar or overlapping sub-problems.

Dynamic programming is used where we have problems, which can be divided into similar sub-problems, so that their results can be re-used. Mostly, these algorithms are used for optimization. Before solving the in-hand sub-problem, dynamic algorithm will try to examine the results of the previously solved sub-problems. The solutions of sub-problems are combined in order to achieve the best solution.

So we can say that −

The problem should be able to be divided into smaller overlapping sub-problem.

An optimum solution can be achieved by using an optimum solution of smaller sub-problems.

Dynamic algorithms use Memoization.

Comparison
In contrast to greedy algorithms, where local optimization is addressed, dynamic algorithms are motivated for an overall optimization of the problem.

In contrast to divide and conquer algorithms, where solutions are combined to achieve an overall solution, dynamic algorithms use the output of a smaller sub-problem and then try to optimize a bigger sub-problem. Dynamic algorithms use Memoization to remember the output of already solved sub-problems.

Example
The following computer problems can be solved using dynamic programming approach −

Fibonacci number series
Knapsack problem
Tower of Hanoi
All pair shortest path by Floyd-Warshall
Shortest path by Dijkstra
Project scheduling
Dynamic programming can be used in both top-down and bottom-up manner. And of course, most of the times, referring to the previous solution output is cheaper than recomputing in terms of CPU cycles.
Assistant: Question: What is dynamic programming, and how is it different from divide and conquer approach?

Answer: Dynamic programming is a problem-solving technique used for optimization. It breaks down problems into smaller sub-problems whose results are remembered and used for similar or overlapping sub-problems. It differs from divide and conquer approach in that it does not solve sub-problems independently, but instead combines the solutions to achieve the best overall solution.

Question: What are the key features of problems that can be solved using dynamic programming?

Answer: Problems that can be solved using dynamic programming must be able to be divided into smaller overlapping sub-problems, and their optimal solutions must be achievable by combining the solutions of smaller sub-problems.

Question: What is memoization in dynamic programming, and why is it used?

Answer: Memoization is a technique used in dynamic programming to store the output of already solved sub-problems in memory, so that they can be easily retrieved and used to solve similar or overlapping sub-problems. It is used to optimize the performance of the algorithm by avoiding unnecessary recomputations.

Question: How does dynamic programming differ from greedy algorithms?

Answer: Dynamic programming algorithms are designed to achieve an overall optimization of the problem, whereas greedy algorithms are designed to optimize local optimization. In dynamic programming, solutions of smaller sub-problems are combined to achieve the best solution for the overall problem, whereas in greedy algorithms, local optimization is addressed without considering the overall problem.

Question: Can you provide some examples of computer problems that can be solved using dynamic programming?

Answer: Some examples of computer problems that can be solved using dynamic programming include Fibonacci number series, knapsack problem, Tower of Hanoi, all pair shortest path by Floyd-Warshall, shortest path by Dijkstra, and project scheduling.