順列ゲームの冗長化
これは以前の質問の言い換えです。 2人のプレーヤー、アリスとボブの間の次の公平で 完璧な情報ゲームを考えてみましょう。プレーヤーには、整数1〜nの順列が与えられます。各ターンで、現在の順列が増加している場合、現在のプレイヤーが負け、他のプレイヤーが勝ちます。そうでない場合、現在のプレーヤーは数字の1つを削除し、プレイは他のプレーヤーに渡されます。アリスが最初にプレイします。例えば: (1,2,3,4)—定義により、ボブはすぐに勝ちます。 (4,3,2,1)—誰がどのようにプレイしても、アリスは3ターン後に勝ちます。 (2,4,1,3)—ボブは、アリスのプレイ方法に関係なく、最初のターンで勝つことができます。 (1,3,2,4)— 2または3を削除すると、アリスがすぐに勝ちます。それ以外の場合、ボブは最初のターンで2または3を削除して勝つことができます。 (1,4,3,2)—アリスは、最初のターンで1を取ると最終的に勝ちます。それ以外の場合、ボブは最初のターンで1を削除しないことで勝つことができます。 完全なプレイを想定して、与えられた開始順列からこのゲームに勝つプレイヤーを決定する多項式時間アルゴリズムはありますか?より一般的には、これは標準的な公平なゲームであるため、すべての順列にはSprague–Grundy値があります。たとえば、(1,2,4,3)の値は* 1で、(1,3,2)の値は* 2です。この値を計算するのはどれくらい難しいですか? 明らかなバックトラッキングアルゴリズムはO(n!)時間で実行されますが、これは動的プログラミングにより時間に短縮できます。O (2nP O LのY(n ))O(2npoly(n))O(2^n poly(n))