1

動的計画法を理解するにつれて、特定の状況で最適な部分構造の概念を開発することがますます容易になっていることに気づきました。たとえば、行列の連鎖を乗算するための最適な順序を見つけることで、Ai * Ai + 1 * ... *Ajを計算するために必要な最小の乗算数を見つけることができることを理解しています(冗長で申し訳ありませんが、それは私を助けます) Ai *... AkとAk+1 ... * Ajに必要な乗算の合計に加えて、実際の寸法に伴うコストを最小化する、iとjの間の分割/並列配置点kを見つけることによって。言い換えると、M(i、j)= mink(M(i、k)+ M(k + 1、j)+ di-1dkdj)です。

同様に、文字列の最長のパリンドローム部分文字列を見つける場合、最適な部分構造は、インデックスiとjの間の最大長の回文の長さl [i、j]であり、入力配列は2 + l [i + 1、j -1]、iとjの要素が同じであるために追加できる場合、またはそれ以外の場合は最大l [i + 1、j]、l [i、j-1](何かを混同した場合は修正してください) ...)

しかし、どのような状況でも、これをアルゴリズムに変換して、上記のような理想的なシーケンスの長さやその内容を見つけるにはどうすればよいでしょうか。基本的に、ループを実行してすべてを表にしてから、基本的にテーブルから必要なものを「選択」しますか?行列の連鎖では、それはまさに何をすべきかと思われますが、回文については、ループを構築する方法について少し混乱しています。

ありがとう!

4

1 に答える 1

1

基本的に、ループを実行してすべてを表にしてから、基本的にテーブルから必要なものを「選択」しますか?

要するに、はい。動的計画法は、元の問題を小さくすること(質問でよく説明されています)と基本ケース:解決策が明白で、問題をサブ問題に分割する必要がなくなった(ほとんどの場合は小さい)状況の2つに依存します。たとえば、行列の乗算の例では、サブ問題が2つの行列に削減されると、選択肢がなくなります。そのまま乗算する必要がありますあなたの回文の例では、長さ1のサブストリングのベースケースを選択します。これは明らかに回文です。

したがって、メモ化配列/行列などを作成したら、通常、その配列にベースケース値を設定し、アルゴリズムを実行します。終了条件は通常、配列内の正しいポイントに到達したとき、または計算するものが残っていないときです(その時点で、配列/マトリックスなどから必要なものを「選択」します)

それが役に立つのに十分具体的であることを願っています。

于 2012-09-28T20:51:41.427 に答える