web-dev-qa-db-ja.com

ドミノソリティアアルゴリズム

問題ステートメント-

Problem Statement

数値の2xNグリッドが与えられた場合、タスクは、すべてのタイルをカバーする最も収益性の高いタイリングの組み合わせ(各タイルは、2x1セルをカバーします。垂直または水平)を見つけることです。

私は貪欲な方法でそれにアプローチし、すべてのセルの可能な最大値をエンキューすることを考えましたが、iでの低利益の選択は、i + nタイルでより大きな利益をもたらす可能性があるというフォールバックがあります。

それでは、アプローチはどうあるべきでしょうか?

編集-テストデータ範囲-N <= 105

出典-INOI2008 Q Paper

[〜#〜] update [〜#〜]-ダイナミックプログラミングアプローチの妥当性の計算。

PDATE 2-DPを使用して回答を作成しました。

2
7Aces

問題への動的計画法アプローチを考案しました-

int t[n][2]; //Stores grid values
int b[n]; //Stores best solution upto a particular column
b[0]= t[0][1]-t[0][0]; //Compute score for first column (Absolute Value)
b[1]= Max (b[0] + Score for column 1 vertically, Score for first 2 horizontal columns);
for i=0...n 
  b[i]= Max ( b[i-1] + Score for column i vertically, b[i-2] + Score for horizontal columns i & i-1);
print b[n-1];

線形の時間計算量で、指定されたデータセットで効率的に機能します!

2
7Aces

これが問題にアプローチ/説明する1つの方法です:

2xNグリッドを見ると、タイリングが次のように一意に定義されていることがわかります。

一番左のブロックについては、水平か垂直かを確認してください。次に、次のブロックを見てください。

2が水平を表し、1が垂直を表しているとすると、タイリング1は次のように書くことができます:121、タイル2は22と書くことができます。

各ベクトルが与えられると、総コストの計算は簡単になります。

これで、このアルゴリズムを使用できます:

  1. 開始位置を見つけます(おそらくあなた自身のアルゴリズムがここでトリックを行うことができます)
  2. ウィンドウの長さ(たとえば5)を指定して、ウィンドウ内の1と0のすべての組み合わせを試し、最大の改善を計算します。
  3. オプション:この改善を実行する
  4. ウィンドウをシフトすると、最初の5つの奇数列ではなく、奇数列2〜6が表示されます。
  5. まだ終了していない場合は、ステップ2に進み、そうでない場合は改善を実行します。
  6. オプション:改善点が見つかった場合は、手順1に進むことができます。
2