9

私は動的プログラミングを独学しようとしていますが、MIT からこの問題に遭遇しました。

4 行 n 列のチェッカーボードが与えられ、各正方形に整数が書かれています。また、2n 個の小石のセットが与えられており、これらの一部またはすべてをチェッカーボードに配置して (各小石は正確に 1 つの正方形に配置できます)、これらの正方形でカバーされる正方形の整数の合計を最大化します。小石。1 つの制約があります。小石の配置が正当であるためには、小石の 2 つを水平または垂直に隣接する正方形に置くことはできません (対角線の隣接は問題ありません)。

(a) 任意の列で発生する可能性のある正当なパターンの数を決定し (孤立して、隣接する列の小石を無視して)、これらのパターンを説明します。正当な配置を形成するために隣接する列に配置できる場合、2 つのパターンを互換性があると呼びます。最初の k 列 1 k n からなる部分問題を考えてみましょう。各サブ問題には、最後の列で発生するパターンであるタイプを割り当てることができます。

(b) 互換性と型の概念を使用して、最適な配置を計算するための O(n) 時間の動的計画法アルゴリズムを与えてください。

さて、パート a について: 8 つの可能な解決策があります。

パート b については、確信が持てませんが、これが私が向かっているところです: サブ問題に分割します。n に i を仮定します。1. 列 i がパターン タイプ j を持つように、列 0,...,i をペブリングすることにより、Cj[i] を最適な値に定義します。2. パターン タイプごとに n 要素の 8 つの個別の配列を作成します。

ここからどこへ行けばいいのかわからない。この問題の解決策がオンラインにあることは認識していますが、解決策はあまり明確ではないようです。

4

1 に答える 1

8

あなたは正しい軌道に乗っています。新しい各列を調べると、その時点までのすべての可能な最高スコアを計算することになります。

互換性リスト (2D 配列) を作成し、それをLi [y]と呼び、各パターンiに対して1 つ以上の互換パターンLi [ y ]があるとします。

ここで、列jを調べます。最初に、各パターンiについてその列の分離スコアを計算します。それをS j [i]と呼びます。各パターンiと互換パターンx = L i [y]について、 C j [x] = C j-1 [i] + S j [x]となるように合計スコアC jを最大化する必要があります。これは、単純な配列のテストと更新 (大きい場合) です。

さらに、各スコアにつながった小石のパターンを保存します。C j [x]を更新する(つまり、スコアを現在の値から増やす) 場合、更新の原因となった最初とその後のパターンをP j [x] = iとして覚えておいてください。つまり、「先行するパターンiを考えると、パターンxが最良の結果をもたらした」ということです。

すべてが終わったら、最高のスコアC n [i]を持つパターンiを見つけるだけです。次に、 P jを使用してバックトラックし、この結果につながった各列から小石のパターンを復元できます。

于 2013-09-23T06:00:22.460 に答える