1. 程式人生 > >SG函數和SG定理(Sprague_Grundy)

SG函數和SG定理(Sprague_Grundy)

所有 屬於 body 發現 logs uda size www .org

一、必勝點和必敗點的概念

P點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。
N點:必勝點,處於此情況下,雙方操作均正確的情況下必勝。


必勝點和必敗點的性質:
1、所有終結點是 必敗點 P 。(我們以此為基本前提進行推理,換句話說,我們以此為假設)
2、從任何必勝點N 操作,至少有一種方式可以進入必敗點 P。
3、無論如何操作,必敗點P 都只能進入 必勝點 N。
我們研究必勝點和必敗點的目的時間為題進行簡化,有助於我們的分析。通常我們分析必勝點和必敗點都是以終結點進行逆序分析。我們以hdu 1847 Good Luck in CET-4 Everybody!為例:


當 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



SG函數和SG定理(Sprague_Grundy)