模板 數學 博弈論

2022-05-07 23:33:17 字數 961 閱讀 4957

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一塊報...