yukicoder No.1151 チャレンジゲーム
問題:No.1151 チャレンジゲーム - yukicoder
Nが小さいので、全状態を列挙してDPする。状態の変数としては、(先手が取ったカード)、(後手が取ったカード)、(どちらの番か)の3変数ですべての状況を表現できる。これで、勝つ確率を求める関数P(3変数)でも作って、確率の高い遷移先を選んでいくというのが基本だと思うが、
今回はそれができない
なぜなら
「2回」の遷移後に元に戻ることがあるから
今、先手の番だとして図にしたのが次の画像
S:先手が取ったカード、T:後手が取ったカード(両方ともbit表現)
っていうのは、の状態からのカードを追加した状態。とかも同様。
このように2手先でループしているので、ここまでをまとめて考えないと先手がどのカードを狙うのが最適かは分からない。よって、関数Pを次のように定義する。
:先手の番において、先手の取ったカードがS、後手の取ったカードがTのとき、先手が勝つ確率
求めたいのは。
ここからは上の図を利用して、(のこと)を求める式を考える。方針としては、=(を含む式)という等式を作り、これをについて解く。
先手が狙うカードをに決め打ちしたとき、は次の式で表される。
・・・★
先手はこれが最大になるようにを選ぶことになる。次にを考える。はループとは関係のない値なので、を固定してしまえば定数として求めることができる。後手がを狙うとすると
となる。ここで重要なのは、を選ぶのは後手なので
が最小となるようなを選ぶ
こと。これでの値は求まるので、これ以降は定数として扱う。次にについて考える。後手がを狙うとすると
となる。この式を式★に代入し、について解くと
となる。これでを求めるための準備ができた。とを2重ループで全探索する。その際、
はが最大となるように
はが最小となるように
決めるようにする。もう少し詳しく言うと
を固定する→を全探索して上の式よりの最小値を求める →各について求めた最小値のうち最大のものを最終的なとする
という流れになる。すべて取られた状態から、取られた枚数の降順にdpしていけばいい。初期値は、すべてのカードが取られたときで、先手の得点の方が多ければ、そうでなければとなる。
提出コード: