POJ 2960(S Nim) 博弈論,SG函式

2021-09-30 13:17:02 字數 709 閱讀 3496

題意:兩個人玩遊戲,規則是有n堆石子,分別有a1,a2,...,an顆石頭,每次從一堆石子中取一些石子,但是可取的石子數是規定了的,必須是中的乙個,誰無法操作就輸。

思路:一開始我還是不懂的,不知道怎麼選擇sg函式值。但是回去研讀了一下sg函式的定義,就明白了:相對於樸素的nim遊戲,可取的石子數是有限制的,那就按照sg函式的定義進行遞迴求解sg值,然後將每一堆的sg值異或,判定一下就可以知道贏還是輸。
**:
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

#define maxn 100+5

#define clr(x,y) memset(x,y,sizeof(x))

int s[maxn],k;

int sg[10000+5];

int sg(int n)

{ if(sg[n]>=0)return sg[n];

if(!n) return sg[n]=0;

int sk[100+5];

clr(sk,0);

for(int i=0;i

POJ2960 S Nim(博弈論 sg函式)

題意 給出一系列石子堆,現在每次只能從乙個堆中拿出固定石子數,問輸贏結果。要點 跟nim博弈很像,但是這次每次只能拿固定個數,所以要用sg函式,下面是sg函式的具體定義 sg x mex sg y y是x的後繼結點 其中mex x x是乙個自然是集合 函式是x關於自然數集合的補集中的最小值,比如x ...

博弈論(階梯博弈)POJ 1704

對階梯博弈的闡述 博弈在一列階梯上進行,每個階梯上放著自然數個點。兩個人進行階梯博弈,每一步則是將乙個集體上的若干個點 1 移到前面去,最後沒有點可以移動的人輸 證明方式 如這就是乙個階梯博弈的初始狀態 2 1 3 2 4 只能把後面的點往前面放 如何來分析這個問題呢 其實階梯博弈經過轉換可以變為n...

poj1740 博弈論,對稱博弈)

題目 有若干堆石子,每一次需要從一堆石子中拿走一些,然後如果願意的話,再從這堆石子中拿一些分給其它任意堆。不能操作的人負。解析 實際上如果n為偶數,我們就可以把ta們兩兩配對 轉換成只有兩堆石子的情況 按照石子數從小到大排序,兩兩配對成一組,組與組之間互不影響 如果可以完美配對 配對後每一組都有兩堆...