オリジナル問題文積み上げる
概要: A と B の 2 人のプレーヤーが、X コインと Y コインの 2 つの山で構成されるゲームをプレイします。各ターン、彼は次のいずれかを実行できます。
- 1つの山から任意の数のコインを取り除きます(少なくとも1コイン)
- 両方の山から同量のコインを取り除く
- ターンを渡します。これでも1ターンとしてカウントされます。
移動が不可能な場合、ゲームは終了し、移動できないプレイヤーが負けます。両方のプレーヤーが最適にプレーします。ゲームが始まる前に、両方のプレイヤーがゲームの結果を計算します。負けたプレイヤーはゲームのターン数を最大化しようとし、勝ったプレイヤーはターン数を最小化しようとします。プレイヤーは P 回を超えてパスできません。A がゲームを開始します。勝者の名前とそのゲームの手数を 1 つのスペースで区切って出力します。0 <= X、Y、P <= 1000
O(n^3) DP ソリューションを思いつきましたが、境界を考慮すると、この問題には十分ではありません。d[i, j] を、これがあなたの番で、パイル X と Y にそれぞれ i と j のコインが残っている場合に勝つための最小ターン数とします。次に、次のようになります。
d[i, j] = 0 if i = j = 0
1 if (i = 0 && j > 0) or (i > 0 && j = 0) or (i = j && i > 0)
min(min(d[i-p, j]), min(d[i, j-q), min(i-r, j-r)) if a each substate is a losing position
max of all winning position substate if no losing substate is found
最終的にd[i,j] = d[i,j] + 2*P if [i,j]
は勝利状態であり、最初からすぐに勝利するわけではありません。
上記の定式化からわかるように、これは O(n^3) ソリューションです。O(n^2) の解を改善したいのですが、どうすれば問題を再定式化できますか?