私はしばらくの間、動的プログラミングに取り組んできました。動的プログラミングの再帰を評価する標準的な方法は、必要なすべての値のテーブルを作成し、行ごとに入力することです。たとえば、Cormen、Leiserson et al: "Introduction to Algorithms"を参照してください。
2次元のテーブルベースの計算スキーム(行ごとの塗りつぶし)に焦点を当て、セルの依存関係の構造、つまり、別のセルを計算する前にどのセルを実行する必要があるかを調べます。セルiが依存するセルのインデックスのセットを示します。Γはサイクルフリーである必要があることに注意してください。
計算された実際の関数から抽象化し、その再帰構造に集中します。正式には、次の形式の場合、繰り返しは動的プログラミングであると考えます。
、〜Γ D(I)= { (J、D (J))| J ∈ Γ D(I)}とFしないいくつかの(計算)関数使用D経由以外の〜Γの dは。
粒度制限すると(現在のセルの左、左上、上、右上、...に)粗い部分に1が有効の3例(アップ対称性及び回転)は、本質的に存在していることを観察しますテーブルへの入力方法を通知する動的プログラミングの再帰:
赤い領域は(過剰近似)を示します。ケース1と2はサブセットを認め、ケース3は最悪の場合です(インデックス変換まで)。赤い領域全体がΓで覆われている必要はないことに注意してください。テーブルのすべての赤い部分の一部のセルは、それを赤く塗るのに十分です。白い領域には、必要なセルが含まれないようにする必要があります。
ケース1の例は、編集距離と最長共通サブシーケンスであり、ケース2はBellman&FordおよびCYKに適用されます。あまり明らかではない例には、提案されたケースに合うように回転できるため、行(または列)ではなく対角線で機能するものが含まれます。例については、ジョーの回答を参照してください。
ただし、ケース3の(自然な)例はありません!だから私の質問は:ケース3の動的プログラミングの再帰/問題の例は何ですか?