私はダイナミックプログラミングの手法を複数回使用しましたが、今日、友人から副問題をどのように定義するかを尋ねられ、客観的な正式な回答を提供する方法がないことに気付きました。動的計画法を使用して解決する問題のサブ問題を正式に定義するにはどうすればよいですか?
私はダイナミックプログラミングの手法を複数回使用しましたが、今日、友人から副問題をどのように定義するかを尋ねられ、客観的な正式な回答を提供する方法がないことに気付きました。動的計画法を使用して解決する問題のサブ問題を正式に定義するにはどうすればよいですか?
回答:
動的プログラミングの原則は、トップダウンで(つまり再帰的に)考え、ボトムアップで解決することです。したがって、DPを設計するための優れた戦略は、問題を再帰的に定式化し、そのようにして副問題を生成することです。
@Sureshが指摘したように、DPで問題を解決できることがわかったら(つまり、最適な部分構造と重複する部分問題を示します)、分割と征服の再帰的ソリューションを考えることができます。
もちろん、分割と征服は非常に非効率的です。なぜなら、関連する再帰ツリーで遭遇するすべての副問題は、すでに発見され解決されていても再び解決されるからです。これがDPの違いです。サブ問題に遭遇するたびに、それを解決し、そのソリューションをテーブルに保存します。後で、その副問題に再び遭遇すると、O(1 )でアクセスしますで再び解くのではなく、その解に。重複するサブ問題の数は通常多項式で制限され、1つのサブ問題を解決するのに必要な時間も多項式であるため(そうでない場合、DPはコスト効率の良いソリューションを提供できません)、一般に多項式ソリューションを実現します。
したがって、分割統治ソリューションについて考えると、特定の問題のサブ問題がどのようなものであるかについての洞察が得られます。