SG函式入門 HDU 1848

2022-05-02 01:30:07 字數 2208 閱讀 1934

sg[i]為0表示i節點先手必敗。

首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數

。例如mex=3、mex=0、mex{}=0。

對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague-grundy

函式g如下:g(x)=mex,這裡的g(x)即sg[x]

例如:取石子問題,有1堆n個的石子,每次只能取個石子,先取完石子者勝利,那麼各個數的sg值為多少?

sg[0]=0,f=,

x=1時,可以取走個石子,剩餘個,mex=mex,故sg[1]=1;

x=2時,可以取走個石子,剩餘個,mex=mex,故sg[2]=0;

x=3時,可以取走個石子,剩餘個,mex=mex,故sg[3]=1;

x=4時,可以取走個石子,剩餘個,mex=mex,故sg[4]=2;

x=5時,可以取走個石子,剩餘個,mex=mex,故sg[5]=3;

以此類推.....

x         0  1  2  3  4  5  6  7  8....

sg[x]      0  1  0  1  2  3  2  0  1....

計算從1-n範圍內的sg值。

f(儲存可以走的步數,f[0]表示可以有多少種走法)

f需要從小到大排序

可選步數為1~m的連續整數,直接取模即可,sg(x) = x % (m+1);

可選步數為任意步,sg(x) = x;

可選步數為一系列不連續的數,用getsg()計算

證明略(不會)

1. 打表

//

f: 可以取走的石子數量

//sg: 1~n的sg函式值

//vis: mex{}

void getsg(int

n) }

}

2. 記憶化搜尋

//

記憶化搜尋

//f: 從小到大排序

//sg: 初始化為-1

//maxm,石子個數,集合的最大數量

int dp(int

x) }

for (int i = 0;; i++)

}

今天,又乙個關於fibonacci的題目出現了,它是乙個小遊戲,定義如下:

1、  這是乙個二人遊戲;

2、  一共有3堆石子,數量分別是m, n, p個;

3、  兩人輪流走;

4、  每走一步可以選擇任意一堆石子,然後取走f個;

5、  f只能是菲波那契數列中的元素(即每次只能取1,2,3,5,8…等數量);

6、  最先取光所有石子的人為勝者;

假設雙方都使用最優策略,請判斷先手的人會贏還是後手的人會贏。

**:

1 #include2 #include3 #include4 #include5

using

namespace

std;67

const

int maxn = 1000 + 10;8

const

int maxm = 20; //

石子個數910

intf[maxm], sg[maxn];

11bool

vis[maxn];

12//

f: 可以取走的石子數量

13//

sg: 1~n的sg函式值

14//

vis: mex{}

15void getsg(int

n) 25}26

}2728//

記憶化搜尋

29//

f: 從小到大排序

30//

sg: 初始化為-1

31//

maxm,石子個數,集合的最大數量

32int dp(int

x)3344}

45for (int i = 0;; i++)

4649}50

5152

void

init()

5359

60int

m, n, p;

6162

intmain()

6371

return0;

72 }

view code

1、2、

HDU 1848 博弈SG函式

題目大意 任何乙個大學生對菲波那契數列 fibonacci numbers 應該都不會陌生,它是這樣定義的 f 1 1 f 2 2 f n f n 1 f n 2 n 3 所以,1,2,3,5,8,13 就是菲波那契數列。在hdoj上有不少相關的題目,比如1005 fibonacci again就是...

博弈(SG函式講解及其應用)(hdu1848)

摘自jumping frog聚聚的部落格 首先定義mex minimal excludant 運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如 mex 3 mex 0 mex 0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague grundy函式g如下 g x ...

HDU1848,SG函式,簡單應用示例

先理解怎麼樣用!然後再弄明白為什麼這樣用。首先定義mex minimal excludant 運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex 3 mex 0 mex 0。對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague grundy函式g如下 g x m...