動的計画法の副問題の決定


39

私はダイナミックプログラミングの手法を複数回使用しましたが、今日、友人から副問題をどのように定義するかを尋ねられ、客観的な正式な回答を提供する方法がないことに気付きました。動的計画法を使用して解決する問題のサブ問題を正式に定義するにはどうすればよいですか?


既存の回答(2019年4月現在)のどれも、特に初心者には十分ではないようです。他のサイトのチュートリアルをお勧めします。
Apass.Jack

回答:


35

動的プログラミングの原則は、トップダウンで(つまり再帰的に)考え、ボトムアップで解決することです。したがって、DPを設計するための優れた戦略は、問題を再帰的に定式化し、そのようにして副問題を生成することです。


14
私はそれが唯一の戦略だと主張します。
JeffE

2
@JeffEはい、アルゴリズムクラスを教えるときにメモを読んで使用しましたが、効果的でした。引用:「動的とは、テーブルに入力することではありません。スマートな再帰です!」

2
DPを教える方法についての私の理解は、@ JeffEのメモの影響を強く受けています。)
Suresh

3
また、トップダウンの再帰プロシージャを動的プログラミングアルゴリズムに自動的に変換することもできます。戻ろうとしているときは、答えをハッシュテーブルに保存します。各呼び出しの開始時に、回答がハッシュテーブルに既に存在するかどうかを確認し、存在する場合はすぐに返します。このアイデアにより、多くのアルゴリズムが簡単になります。たとえば、このようなテーブルでは、試行の再帰アルゴリズムがDAWGで自動的に機能します。呼び出しの開始時にテーブルにセンチネル値を保存することにより、DFAでも同じアルゴリズムを使用できます。BDDのアルゴリズムは、再帰的に指定するのが非常に簡単になります。
ジュール

1
最後になりましたが、これにはパフォーマンス上の大きな利点があります。たとえば、従来のボトムアップサブセット合計アルゴリズムでは、大量の不要なテーブルエントリを計算できます。この方法では、必要なテーブルエントリのみが計算されます。
ジュール

4

@Sureshが指摘したように、DPで問題を解決できることがわかったら(つまり、最適な部分構造と重複する部分問題を示します)、分割と征服の再帰的ソリューションを考えることができます。

もちろん、分割と征服は非常に非効率的です。なぜなら、関連する再帰ツリーで遭遇するすべての副問題は、すでに発見され解決されていても再び解決されるからです。これがDPの違いです。サブ問題に遭遇するたびに、それを解決し、そのソリューションをテーブルに保存します。後で、その副問題に再び遭遇すると、O1 )でアクセスしますO1で再び解くのではなく、その解に。重複するサブ問題の数は通常多項式で制限され、1つのサブ問題を解決するのに必要な時間も多項式であるため(そうでない場合、DPはコスト効率の良いソリューションを提供できません)、一般に多項式ソリューションを実現します。

したがって、分割統治ソリューションについて考えると、特定の問題のサブ問題がどのようなものであるかについての洞察が得られます。


1
「最適な下部構造」(それが何を意味するにせよ)は、おそらくDP可解性にとって十分な条件ではありません。「重複するサブ問題」は、必ずしも必要なものではありません。
ラファエル

1
最適な下部構造と重複する問題は、DPで効率的に解決できる問題によって示されます。もちろん、最適な下部構造だけではDPの可解性には不十分です。ただし、重複する副問題がない場合は、通常の除算で問題を解決し、同じコストで征服できます。実際、征服を除算するよりもDPの利点は、再帰ツリーで各副問題が1回だけ解決されることです。 。
マッシモカファロ

1
それは私の定式化ではありません。Cormen、Leiserson、Rivest、Steinによる「Introduction to algorithm」や、アルゴリズムに関する他の多くの教科書にあります。
マッシモカファロ

1
Jup、そしてほとんどは少なくとも部分的に間違っています。適切な質問を投稿していただければ幸いです。
ラファエル

1
あなたの最後のコメントを正しく理解しているかどうかはわかりません。この種の特性評価が間違っていることを示すために(部分的に間違っていることはありません:正しいか間違っているかのどちらかです)、反例として、最適な部分構造と重複する副問題の両方を示さない問題を単純に示すことができます多項式のDP解を受け入れます。しかし、これに関連して、それは通常の分割統治よりも証明できるほど良い解決策を意味することに注意してください。
マッシモカファロ

2

私の経験では、「既に列挙されている有用な値を保存することで冗長な列挙を削減する」方法を見つけています。ちなみに、ダイナミックプログラミングはICPC(International Collegiate Programming Contest)で非常に人気があります。ICPCのいくつかの問題を練習した後、だれでもDPについて自分の気持ちを持つことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.