1.要從必勝或必敗的局面反推
2.sg函式
只要當前狀態可以轉移到的狀態中有乙個是敗態,那麼當前狀態就是勝態。勝態為n。
如果當前狀態可以轉移到的所有狀態都是勝態,那麼當前狀態就是敗態。敗態為p。
sg函式為每個狀態賦乙個自然數的值,這個值為除這個狀態的後繼外的最小自然數。首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。
從圖的匯點開始反推,可知匯點(第乙個敗態)的sg值為0。
性質:敗態等價於sg值為0。
遊戲和的sg函式等於各個遊戲sg函式的nim和。這樣就可以將每乙個子遊戲分而治之,從而簡化了問題。
類似這樣用
```cpp
#include
using namespace std;
typedef long long ll;
const int maxn=1000005;
const int n=1000005;
//f[n]:可改變當前狀態的方式,n為方式的種類,f[n]要在getsg之前先預處理
//sg:0~n的sg函式值
//s:為x後繼狀態的集合
vectornextofsg[maxn];
int f[n],sg[maxn],s[maxn];
void getsg(int n)
for(auto vi:nextofsg[i])
for(int j=0;j<=l;j++)
}cout<<"sg["void enque(int id)
}int main()
}*/for(int i=0;i<=nnn;++i)
getsg(nnn);
}
模板 數學 博弈論 SG函式
f i 表示狀態i的後繼狀態,把它的後繼狀態push back 進去,然後呼叫getsg 就可以得到sg函式。無法轉移的狀態都是失敗狀態,這種寫法貌似只能向標號更小的狀態轉移 本身這個圖就是dag,就有拓撲序,所以本質上無所謂,更何況取石子非常直觀 所以一般f 0 就是失敗狀態。當然也可能會有別的失...
初學博弈論
只有一堆n個石子,兩個人輪流從這堆石子中取石子,規定每次至少取乙個,最多取m個,最後取完的人獲勝。當n m的時候,顯然先手獲勝,因為一次就能取完。當n m 1 的時候,由於先手最多取走m個,無論其取走多少個,剩下的後手均可以一次取完,顯然後手勝。根據以上分析,我們可以將n寫成n m 1 r s的形式...
博弈論模板
原部落格位址 一.巴什博奕 bash game a和b一塊報數,每人每次報最少1個,最多報4個,看誰先報到30。這應該是最古老的關於巴什博奕的遊戲了吧。其實如果知道原理,這遊戲一點運氣成分都沒有,只和先手後手有關,比如第一次報數,a報k個數,那麼b報5 k個數,那麼b報數之後問題就變為,a和b一塊報...