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

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

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

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

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

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

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

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

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

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

フィボナッチ番号シリーズ
ナップサックの問題
ハノイの塔
フロイド・ウォーシャルによるすべての最短パス
Dijkstraによる最短パス
プロジェクトのスケジューリング
動的プログラミングは、トップダウンとボトムアップの両方で使用できます。そしてもちろん、ほとんどの場合、以前のソリューション出力を参照することは、CPUサイクルの観点から再計算するよりも安価です。
動的プログラミングとは何ですか？
動的プログラミングは、問題をより小さく、重複するサブ問題に分解できる最適化の問題に使用される問題解決手法であり、これらのサブ問題のソリューションが記憶され、類似または重複するサブ問題を解決するために使用されます。

ダイナミックプログラミングは、Divide and Conquerとどのように異なりますか？
動的プログラミングは、分裂と征服に似ており、問題をより小さなサブ問題に分解します。ただし、Divide and Conquerとは異なり、動的なプログラミングは、これらの小さなサブ問題のソリューションを覚えて使用して、同様または重複するサブ問題を解決します。

動的プログラミングのメモとは何ですか？
メモ化は、すでに解決されたサブ問題の出力を思い出すために動的プログラミングで使用される手法です。これにより、アルゴリズムの時間の複雑さを短縮するのに役立ちます。

動的プログラミングは、貪欲なアルゴリズムとどのように異なりますか？
貪欲なアルゴリズムはローカルの最適化に焦点を当てていますが、動的プログラミングは問題の全体的な最適化の動機付けです。

動的プログラミングを使用して解決できる問題の例は何ですか？
ダイナミックプログラミングを使用して解決できる問題の例には、Fibonacci Number Series、Knapsack問題、HanoiのTower、Floyd-Warshallによる最短パス、Dijkstraによる最短パス、プロジェクトのスケジューリングが含まれます。

動的プログラミングは、トップダウンとボトムアップの両方で使用できますか？
はい、ダイナミックプログラミングは、トップダウン（メモ化）とボトムアップ（集計）の両方で使用できます。