我對SG函式的理解

2021-08-02 06:11:08 字數 1473 閱讀 8316

i

的sg函式g(

i)定義如下:如果該點沒有出邊,g(

i)=0

,否則定義乙個mex(minimal excludant)操作,這是對乙個集合進行的操作,返回值為集合中所不包含的最小的非負整數,那麼g(

i)=m

ex。顯然對於乙個有向無環圖,我們都能在o(

狀態總數

×每個點

的後繼狀

態數) 時間內求出所有點的sg函式值,那麼這個sg函式又有什麼性質呢?設g(

i)=k

,這就表示從點

i 可以走到乙個sg函式值等於0,

1,2,

...,

k−1的點,這是不是很像nim遊戲中的「取石子」操作?nim遊戲中,可以將乙個有

k 個石子的堆變為有0,

1,2,

...,

k−1個石子的堆,而對於任何乙個icg,從乙個g(

i)=k

的狀態可以走到乙個g(

i)=0

,1,2

,...

,k−1

的狀態,這就說明icg和nim遊戲有著一種聯絡。

而上面的有向圖遊戲除了終止點外,都是先手必勝的(因為可以直接走到g(

i)=0

的點),我們需要研究更加複雜的遊戲,那麼我們定義乙個「組合遊戲」:乙個遊戲由若干個「子遊戲」組成,每個子遊戲都是乙個icg,而整個遊戲要求每次挑選乙個子遊戲進行行動,那麼這樣乙個遊戲的p/n-position性質要怎麼計算呢?前面我們介紹了nim遊戲與icg之間的聯絡,而在研究nim遊戲時我們有乙個結論:如果每堆石子的數量異或起來值為

0 ,那麼先手必敗,否則先手必勝。那麼我們模擬nim遊戲和上面的組合遊戲,發現nim遊戲中每堆石子的數量和組合遊戲中每乙個子遊戲的初始狀態的sg函式值是對應的,那麼nim遊戲中的結論也可以套到這樣的組合遊戲中來:若組合遊戲的每乙個子遊戲中初始狀態的sg函式值異或起來等於

0,那麼這個組合遊戲先手必敗,否則先手必勝。這樣我們就完全破解了這類遊戲中狀態性質的計算。

上面講了這麼多,大家可能覺得比較難理解,那麼我們就舉個例子:

s-nim遊戲(hdu1944):有

l 堆珠子,每堆珠子數量可能不同(最大可能為n=

10000

),雙方輪流行動,每次行動從一堆珠子中取出若干顆,取出的珠子數量必須是乙個正整數集合

s 中的乙個數,若輪到某一方時不能按照規則行動,那麼這一方判負,給出初始狀態和集合

s,問先手必勝還是先手必敗。1≤

l,|s

|≤100 。

很容易可以把s-nim遊戲轉化為上述的組合遊戲的模型,我們只需把每一堆珠子看做乙個子遊戲即可,注意到這些子遊戲所轉化成的有向圖都是一樣的,所以我們預處理出所有點的sg函式值,然後判斷每一堆珠子數量對應的狀態點的sg函式值異或起來是不是

0 即可。時間複雜度為o(

|s|n

)。需要**的話請看這裡。

以上就是我對sg函式的理解。

自己對sg函式的小理解

首先定義mex minimal excludant 運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex 3 mex 0 mex 0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague garundy函式g如下 g x mex。sg函式的一些性質 1 當sg 0...

C 我對虛函式的理解

虛函式 就是在宣告時前面加了virtual 關鍵字的成員函式。用來構成多型類就不用說了 好吧,在不了解太多底層知識的情況下,講白了,虛函式的作用是滿足一定條件下,阻止靜態聯編,使得在執行到通過基型別指標ptr呼叫的,在基類和派生類中都有的同名同引數列表的成員 虛 函式func的語句時,根據指標ptr...

關於sg函式打表的理解

博弈的題大多數用sg函式打表找規律 博弈的題大多數用sg函式打表找規律 博弈的題大多數用sg函式打表找規律 記憶話搜尋可以更快 記憶話搜尋可以更快 記憶話搜尋可以更快 定義sg值為0時表示後手必勝,sg為1時為先手必勝。那麼對於每乙個人,都會去查詢使得當前狀態變成sg值為0的情況 那麼就是說,對於多...