SG函式和SG定理(Sprague_Grundy)
一、必勝點和必敗點的概念
P點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。
N點:必勝點,處於此情況下,雙方操作均正確的情況下必勝。
必勝點和必敗點的性質:
1、所有終結點是 必敗點 P 。(我們以此為基本前提進行推理,換句話說,我們以此為假設)
2、從任何必勝點N 操作,至少有一種方式可以進入必敗點 P。
3、無論如何操作,必敗點P 都只能進入 必勝點 N。
我們研究必勝點和必敗點的目的時間為題進行簡化,有助於我們的分析。通常我們分析必勝點和必敗點都是以終結點進行逆序分析。我們以
當 n = 0 時,顯然為必敗點,因為此時你已經無法進行操作了
當 n = 1 時,因為你一次就可以拿完所有牌,故此時為必勝點
當 n = 2 時,也是一次就可以拿完,故此時為必勝點
當 n = 3 時,要麼就是剩一張要麼剩兩張,無論怎麼取對方都將面對必勝點,故這一點為必敗點。
以此類推,最後你就可以得到;
n : 0 1 2 3 4 5 6 ...
position: P N N P N N P ...
你發現了什麼沒有,對,他們就是成有規律,使用了 P/N來分析,有沒有覺得問題變簡單了。
二、Sprague-Grundy定理(SG定理)
遊戲和的SG函式等於各個遊戲SG函式的Nim和。這樣就可以將每一個子遊戲分而治之,從而簡化了問題。而Bouton定理就是Sprague-Grundy定理在Nim遊戲中的直接應用,因為單堆的Nim遊戲 SG函式滿足 SG(x) = x。
(NIM遊戲:https://blog.csdn.net/luomingjun12315/article/details/45479073)
三、Sprague-Grundy函式(SG函式)
首先定義mex(minimal excludant)運算,這是施加於一個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
對於任意狀態 x , 定義 SG(x) = mex(S),其中 S 是 x 後繼狀態的SG函式值的集合。如 x 有三個後繼狀態分別為 SG(a),SG(b),SG(c),那麼SG(x) = mex{SG(a),SG(b),SG(c)}。 這樣 集合S 的終態必然是空集,所以SG函式的終態為 SG(x) = 0,當且僅當 x 為必敗點P時。
四、例題
http://poj.org/problem?id=2975
http://poj.org/problem?id=2960
https://ac.nowcoder.com/acm/contest/338/I
五、參考文章
https://blog.csdn.net/luomingjun12315/article/details/45555495
https://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html
https://blog.csdn.net/kamisama123/article/details/77649118