Ex - General General Editorial by m_99
\(i=x\) として行う操作を 操作 \(x\) と呼ぶことにします。
操作方法の絞り込み
操作方法として考慮するのは以下の条件を満たす場合のみで十分です。
- \(1\) 回以上使う操作が \(2\) 種類以下である
- \(1\) 回以上使う操作が \(3\) 種類で、そのうち \(2\) つは操作 \(2,4,6,8\) のいずれか、残る \(1\) つは操作 \(1,3,5,7\) のいずれかかつ後者を使う回数は \(1\) 回
証明
上記 $2$ つの条件に当てはまらないような操作方法は、操作回数を増やさずに上記 $2$ つに当てはまるようにできることを示します。 まず、使う操作が $3$ 種類の場合をそれぞれ以下に示します。(反転や回転によって一致するものや、操作 $1,5$ のように正反対の向きへの移動をともに使っているようなものは省いています)対称性等の利用
条件の \(2\) 番目では使う操作が \(3\) 種類とありますが、そのうち \(1\) つは使う回数が \(1\) 回です。よって、操作 \(1,3,5,7\) のうち \(1\) 回使うものを全探索することで使う操作が \(2\) 種類以下である場合のみが分かれば良くなります。
使う操作が \(2\) 種類以下の場合ですが、対称性を利用することでいくらか簡単に網羅することが出来ます。\((A',B') = (B,-A), s'=s_3s_4s_5s_6s_7s_8s_1s_2\) とすると、目標となる移動先と操作の向きをそれぞれ \(90\) 度回転させたことになります。これを利用して\(0,90,180,270\) 度回転させた場合それぞれについて調べることにすると、以下の \(9\) つの場合を調べれば十分となります。
- 操作をしない場合
- 操作 \(1\) のみを使う場合
- 操作 \(2\) のみを使う場合
- 操作 \(1,2\) を使う場合
- 操作 \(1,3\) を使う場合
- 操作 \(1,4\) を使う場合
- 操作 \(1,6\) を使う場合
- 操作 \(1,8\) を使う場合
- 操作 \(2,4\) を使う場合
お好みで、上下反転した場合も考えることで\(4\) 番目と \(8\) 番目、\(6\) 番目と \(7\) 番目を一致させても良いかもしれません。
別解
\(\mathrm{dp}_{i,j,k}\) を、操作 \(1,2,\ldots,8\) を使う回数の \(2^0, 2^1, \ldots, 2^i\) の位を決めていて、 \(x\) 座標/ \(y\) 座標における繰上り/繰り下がりが \(j\) / \(k\) であるような場合の操作回数の最小値とします。この \(\mathrm{dp}\) は、遷移を前計算しておくことにすると \(1\) ケースでは \(\log A \times 7 \times 7\) 個の状態から最大で \(37\) 種類の遷移を行うことになり、\(T=10^4\) ではおよそ \(6 \times 10^8\) ステップ程度と見積もれます。これは多くの問題の想定解におけるステップ数と比べて大きめですが、実際、\(1\) 秒未満で動作します。
実装等に依存する定数倍によって実行時間制限に間に合わない可能性を考慮すると、最悪ケースが \(s_1s_2s_3s_4s_5s_6s_7s_8=\) 11111111
であることがほとんど明らかなことを利用し、コードテストで間に合うことを確認してから提出するのが安全でしょう。
posted:
last update: