問題ステートメント-
数値の2xNグリッドが与えられた場合、タスクは、すべてのタイルをカバーする最も収益性の高いタイリングの組み合わせ(各タイルは、2x1セルをカバーします。垂直または水平)を見つけることです。
私は貪欲な方法でそれにアプローチし、すべてのセルの可能な最大値をエンキューすることを考えましたが、iでの低利益の選択は、i + nタイルでより大きな利益をもたらす可能性があるというフォールバックがあります。
それでは、アプローチはどうあるべきでしょうか?
編集-テストデータ範囲-N <= 105
出典-INOI2008 Q Paper
[〜#〜] update [〜#〜]-ダイナミックプログラミングアプローチの妥当性の計算。
PDATE 2-DPを使用して回答を作成しました。
問題への動的計画法アプローチを考案しました-
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];
線形の時間計算量で、指定されたデータセットで効率的に機能します!
これが問題にアプローチ/説明する1つの方法です:
2xNグリッドを見ると、タイリングが次のように一意に定義されていることがわかります。
一番左のブロックについては、水平か垂直かを確認してください。次に、次のブロックを見てください。
2が水平を表し、1が垂直を表しているとすると、タイリング1は次のように書くことができます:121、タイル2は22と書くことができます。
各ベクトルが与えられると、総コストの計算は簡単になります。
これで、このアルゴリズムを使用できます: