動的計画法を理解するにつれて、特定の状況で最適な部分構造の概念を開発することがますます容易になっていることに気づきました。たとえば、行列の連鎖を乗算するための最適な順序を見つけることで、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](何かを混同した場合は修正してください) ...)
しかし、どのような状況でも、これをアルゴリズムに変換して、上記のような理想的なシーケンスの長さやその内容を見つけるにはどうすればよいでしょうか。基本的に、ループを実行してすべてを表にしてから、基本的にテーブルから必要なものを「選択」しますか?行列の連鎖では、それはまさに何をすべきかと思われますが、回文については、ループを構築する方法について少し混乱しています。
ありがとう!