私は動的プログラミングについて読んでいました。ダイナミックプログラミングを「反復」と「再帰」のどちらの方法で適用できるのか、それとも1つの方法だけを適用するのがよいのかを知りたかったのです。良い例やリンクがあれば助かります。動的プログラミング再帰的または反復的
答えて
はい、両方にDPを適用できます。ここ
スタート:http://en.wikipedia.org/wiki/Dynamic_programming
次にあなたが最初のチュートリアルについてはDynamic Programming: From novice to advancedとA Tutorial on Dynamic Programming
を持って、あなたが実際に問題TopCoder.comへのリンクがあります(これらの問題のそれぞれがアイデアを説明するもEditorialを持っています溶液の背後。
動的プログラミングは逆に実装再帰溶液として(多くの場合に)見ることができる。
N口腔内で、再帰では、n=0
(またはその他の値)の停止条件を指定してx(n+1) = f(x(n))
を計算します。
多くの場合、関数f
は最小/最大関数ですが、必ずしもそうである必要はありません。 また、関数は単一の変数をとる必要はありません。
ダイナミックプログラミングは複数の変数で、その後、f(1)
その後、f(2)
など
をf(0)
を計算することにより、この問題を解決するだろう、通常の関数を計算するためにいくつかの自然な順序が存在することになります。
動的プログラミングで解決できる例: 3つのゴルフクラブが割り当てられています。各ゴルフクラブは、前方に距離x単位(例えば、24,37および54単位)のゴルフボールを送ることができる。問題は、ちょうど200単位離れた穴を打つことができますか?あなたができるならば、必要なショット数はどれくらいですか? nは、nが0より小さい場合、いくつかの巨大な数0である、と表現場合、これは些細な実装、機能shot(n)
0を返すことが可能になる
shots(200) = min(shots(200-24),shots(200-37),shots(200-54))
:
再帰的な解決策は次のようなものになるだろうそれ以外は上記。
しかし、nの値が大きい場合は、上記の式の異なる枝から同じ値を何度も繰り返し打つことになります。その場合、0から始まり、shots(0)
、shots(1)
、shots(2)
などを計算する方が良いでしょう。これは、指数関数時間の代わりに線形時間と一定の空間を使用して、この問題に対する "動的プログラミング" )と最高の線形空間(呼び出しスタックの場合)。
- 1. 再帰的Vs反復的BSTのトラバーサル
- 2. 再帰と動的プログラミング
- 3. Odooの再帰的プログラミング
- 4. Bottom Up動的プログラミングは再帰的ですか?
- 5. 再帰的ツリーウォーキング関数を反復的に変換する
- 6. PHP - ディレクトリを再帰的から反復的にブラウズする
- 7. 再帰的メソッドと標準的な反復メソッド
- 8. Matlabの再帰的ループは、反復できません
- 9. Dafny再帰的アサーション違反
- 10. 再帰的にネストされたPython辞書を反復する
- 11. アルファベットを再帰的に反復するには?
- 12. Pythonの再帰関数を使った動的プログラミング
- 13. 意思決定ツリーの再帰的プログラミング
- 14. このメソッドを再帰的から反復的に変換する
- 15. は再帰的
- 16. 再帰的なJavaプログラミング、ナイトのツアーはナッツを動かす
- 17. 動的プログラミングのアイデアへのリライト関数の復帰
- 18. 再帰的なfor動的ポインタ
- 19. MIPSコードの再帰的反復文字列の複雑さ
- 20. リスト/配列を再帰的に反復する
- 21. 入れ子配列のPHP再帰的反復
- 22. bashスクリプト - 2つのディレクトリに再帰的に反復する
- 23. 再帰的なCTE取得全部の反復からの親
- 24. Pythonでオブジェクトを再帰的に反復する
- 25. mongoのpython辞書による再帰的反復
- 26. 反復メソッドを再帰的メソッド(Java)に変換する方法
- 27. Vuejs2 - "tr"要素を再帰的に反復する
- 28. 単一リンクリストでの単純な再帰的反復処理JavaScript
- 29. 再帰的な反復可能なテンプレート関数C++
- 30. プロミスイテレータを反復する非再帰的メソッド
memoizationをスローすると、トップダウンアプローチは動的プログラミングと見なされます。ボトムアップDPとトップダウンDPは両方ともDPです。 – harold
@haroldあなたが正しいと思いますが、私はおそらくmemoizationについて何かを追加しておくべきでしょう(メモリ要件を妥当なものにしたい場合は使用するのが少し難しいので、値を "忘れる"それはかなり明確です)。 –
キャッシングを伴う再帰的な解法は、数値のわずかな部分集合を見ますが、反復解法はすべてを調べなければなりません(少なくともそれを避けるのは簡単ではありません)。したがって、この場合、再帰的な解法はより速く実行されるようです。 – AlwaysLearning