提供されたテキストを要約し、それをカードに変換します。すべてのカードには、質問と短い答えが含まれている必要があります。

動的プログラミングアプローチは、分裂と征服に似ており、問題をより小さく、さらに小さいサブ問題に分解します。しかし、分裂と征服とは異なり、これらのサブ問題は独立して解決されません。むしろ、これらの小さなサブ問題の結果は記憶され、類似または重複するサブ問題に使用されます。

動的プログラミングは、問題がある場合に使用されます。これは、同様のサブ問題に分けることができ、結果を再利用できるようにします。ほとんどの場合、これらのアルゴリズムは最適化に使用されます。手元のサブ問題を解決する前に、動的アルゴリズムは、以前に解決されたサブ問題の結果を調べようとします。最良のソリューションを実現するために、サブ問題のソリューションを組み合わせています。

だから私たちはそれを言うことができます - 

問題は、より小さな重複するサブ問題に分割できるはずです。

より小さなサブ問題の最適なソリューションを使用することにより、最適なソリューションを実現できます。

動的アルゴリズムはメモを使用します。

比較
ローカルの最適化に対処されている貪欲なアルゴリズムとは対照的に、問題の全体的な最適化の動機付けが動機付けられています。

ソリューションを組み合わせて全体的なソリューションを実現するアルゴリズムを分割および征服するのとは対照的に、動的アルゴリズムはより小さなサブ問題の出力を使用し、より大きなサブ問題を最適化しようとします。動的アルゴリズムはメモを使用して、すでに解決されたサブ問題の出力を思い出します。

例
次のコンピューターの問題は、動的プログラミングアプローチを使用して解決できます - 

フィボナッチ番号シリーズ
ナップサックの問題
ハノイの塔
フロイド・ウォーシャルによるすべての最短パス
Dijkstraによる最短パス
プロジェクトのスケジューリング
動的プログラミングは、トップダウンとボトムアップの両方で使用できます。そしてもちろん、ほとんどの場合、以前のソリューション出力を参照することは、CPUサイクルの観点から再計算するよりも安価です。
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.