概述
博弈論的研究對象是一類游戲,有特定的模型。
基礎模型——先手必勝還是后手必勝?
好像有個專門的名詞叫做Impartial Combinatorial Games(簡稱ICG)
大概的定義如下:
整個游戲可以抽象成一個DAG;
每個點都代表游戲過程中的某個決策狀態(特殊的,出度為0的點是游戲的終止狀態);
每條邊都表示可以從某個狀態,經過直接的一次操作,轉移到另一個狀態。
有兩個玩家,從指定的某個狀態開始,依次執行操作,誰先因為當前到達了終止狀態而無法操作的人輸。
因為是DAG,所以一定會轉移到終止狀態的。
問題就是,從某狀態開始,先手必勝還是后手必勝?
舉個栗子——Nim游戲的一個變種
有一堆\(n\)個石子,每次可以取\(1-k\)個,當前無法操作的人輸,問是否先手存在必勝策略?
對於這種問題,對於以每個狀態為起點的情況,我們都會唯一確定是先手必勝還是后手必勝。
這應該是很好想,幾乎不用證明的。
可以對每個點標記兩種狀態N和P,分別表示先手必勝和后手必勝
首先根據定義,終狀態為P
然后,所有能直接到達終狀態的狀態就為N了
進一步推廣,如果某點的出邊指向的點的集合中,有至少一個點為P,那么這個點為N;否則就為P。
比如對於上面提到的栗子
對每個狀態都標號為當前剩余石子數
那么\(0\)是P,\(1-k\)就都是N,\(k+1\)是P。。。。。。
接着就可以推出當且僅當\((k+1)\mid a\)時a是P。
對於這種基礎的問題,枚舉狀態建好圖后DP或者記憶化搜索就可以快速解決了。
模型升級——SG函數與SG定理
博弈論所涉及到的更多的游戲,會把若干ICG拼湊在一起,成為一個規模更大的模型。
比如說上面那個Nim游戲變種的升級版——
有\(n\)堆石子,每堆\(a_i\)個,每次可以取\(1-k\)個,當前無法操作的人輸,問是否先手存在必勝策略?
這時候,如果仍沿用上面的方法求解,我們會發現狀態維度很大,時間和空間根本承受不了。
這里介紹SG函數與SG定理,詳細證明就算了,我太弱了。
strangedbly巨佬的博客給出了十分易懂的證明,個人力薦。
定義運算\(mex(S)\)(S是一個自然數集合),結果為S中未出現的最小自然數。
定義\(SG(i)\)(i是一個狀態,在圖中是一個點)為對所有\(i\)可直達狀態(在圖中與i通過有向邊連接的所有點)的SG函數值取mex的值,即。
定義SG定理:點\(i\)為P當且僅當\(SG(i)=0\)
若干ICG(可以不相同)組合在一起的游戲,把每個游戲的SG值異或起來,不為0則先手必勝。
接着對例子分析一下。
可以發現,對於單堆石子來說,剩零個時\(SG\)值為\(0\),剩一個時為\(1\)。。。剩\(k\)個為\(k\),剩\(k+1\)個時因為不能轉移到零個,\(SG\)值又變成了\(0\)。。。。。。
這可以說明SG函數對於判斷狀態為N還是P是非常有效的。
那么對於若干堆石子(即整個升級版游戲)來說,勝負又會如何呢?只要把這若干個\(SG\)值都異或起來就完全OK啦。
實現
簡單的ICG可直接通過遞推、DP等方法推導出所有點的狀態。當然,如果找到規律,可以直接\(O(1)\)判斷都說不好。
多個ICG的組合游戲,則一定是離不開SG函數的。
但假如點非常多,或者每個點的后繼確定起來非常麻煩的時候,DP是不能解決問題的。
那怎么辦?那肯定是有規律啊!一眼看不出規律怎么辦?可別忘了打表啊!
當然,打表也是有技巧的。至於如何如何,蒟蒻也說不出什么門道來,還是多刷題為上上策。
題目
- 【Done】洛谷P2197 nim游戲
- 【Sol.】洛谷P2148 [SDOI2009]E&D
- 【Todo】洛谷P2575 高手過招
- 【Todo】洛谷P2594 [ZJOI2009]染色游戲
- 【Todo】洛谷P3185 [HNOI2007]分裂游戲