博弈論是acm比賽中的乙個很重要的理論,雖然很多情況可以套用公式
本文主要博弈論的經典型別和公式
一堆n個物品,兩個人輪流從中取出1~m個,最後取光者勝(不能繼續取的人輸)。同餘定理:n=k∗(m+1)+r,先者拿走r個,那麼後者無論拿走1 m個先者只要的數目使和為m+1,那麼先手必贏。反之若n=k∗(m+1),那麼先手無論怎樣都會輸。
if
一堆石子有n個,兩人輪流取,先取者第一次可以去任意多個,但是不能取完,以後每次取的石子數不能超過上次取子數的2倍。取完者勝。同樣是乙個規律:先手勝當且僅當n不是斐波那契數。
複製**
f
有兩堆各若干物品,兩個人輪流從任意一堆中至少取出乙個或者從兩堆中取出同樣多的物品,規定每次至少取乙個,至多不限,最後取光者勝。這裡的必輸局勢:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。從這些必輸局勢可以發現,每組的第乙個是前面沒有出現的最小正整數,ak=[k∗(1+5–√)/2], bk=ak+k, k=0,1,2,3...。
所以,先求出差值,差值***分割比 == 最小值的話後手贏,否者先手贏。
double
注:如果a,b的值非常大的話,需要高精度來計算這個double型別的r。
有n堆物品,兩人輪流取,每次取某堆中不少於1個,最後取完者勝。假如有3堆物品(a,b,c) (0,0,0)狀態時先手是乙個必輸局勢因為沒有東西可取,(0,n,n) 狀態時也是必輸局勢只要後者在另一堆取得物品與前者一樣多時那麼前者也就是必輸局勢。慢分析(1,2,3)也是乙個必輸局勢。如果我們將其轉化為二進位制形式並通過異或運算(^)我們會發現:
0001^0010^0011=0000
通過驗證所有的堆數量累^後只要為0就都是必輸局勢,所以我們就只要記住這個規則:將n堆物品數量全部異或後結果為0先手必敗,否則必勝。
int
問:但是,實際問題中不可能給出如此標準的博弈模型,對於更加一般的博弈問題,我們該如何求解呢?
答:通過sg函式轉換為尼姆博弈。
首先給出一種icg博弈遊戲模型,給定乙個有向無環圖和乙個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿著有向邊進行移動,無法移動者判負。
將icg問題進行轉化:任何乙個icg都可以通過把每個局面看作乙個頂點,對每個局面和它的子局面連一條有向邊來抽象這個「有向圖遊戲」。
於是我們將icg問題轉化為上述這個遊戲,再通過尋找這個遊戲的一般解法來處理icg問題。
首先定義mex(minimal excludant)運算,這是定義於乙個集合的運算,表示最小的不屬於這個集合的最小非負整數。例如mex=3,mex=0,mex{}=0.
sg函式(sprague-grundy):對於乙個給定的有向無環圖,定義關於這個圖的每個頂點的sg函式如下:
$$ sg(x)=mex $$sg函式的求法:
找出必敗態
找出當前所有狀態的前驅結點
根據定義計算結點sg值
重複上述步驟,直到整棵樹建立完成
按上述步驟建成的樹如下:
這顆樹有什麼意義呢?比如說我們將乙個頂點放在根節點上,當前這個點的sg值為0,說明當前這個點是必敗態。為什麼這麼說呢?我們將這個點交替進行移動,先手有兩種選擇,往右移動,顯然後手再移動一步就進入必敗態;往左移動,後手會選擇往右移動,先手同樣進入必敗態。
如何通過sg函式值來解決之前的有向圖問題呢?對於n個棋子,設它們對應的頂點的sg函式值分別為,再設局面時的nim遊戲的必勝策略是把ai變成k,那麼原遊戲的一種必勝策略就是把第i枚棋子移動到乙個sg值為k的頂點。
簡單來說,我們讓每個結點都擁有乙個sg值(假設這個值為x),那麼對於任何乙個玩家操作(移動到當前結點的某個後繼結點)實際上就是把棋子移動到0~x-1的某個結點上,等價的就是從x個物品中取走乙個,最多x個!。
不是是覺得有點不對,單根據mex的定義,可能出現如下情況,移動到比自身sg值大的結點:
其實這種情況是不存在的,博弈問題中先手不會移動到對自己不利的局面的,在這裡也就是不會移動到sg值為4的結點。
sg定理:所以我們可以定義有向圖遊戲的和。設g1,g2,...gn為n個「有向圖」遊戲的和(sum),遊戲g的移動規則是:任選乙個子遊戲gi並移動上面的棋子。sg定理就是:sg(g)=sg(g1)∧sg(g2)∧....∧sg(gn)。也就是說,遊戲的sg函式值就是它的所有子遊戲的sg函式值的異或。
因此,當我們面對n個不同遊組成的遊戲時,只需要求出每個遊戲的sg函式值,把這些sg值都看作nim的石子堆,然後依照找nim遊戲的必勝策略的方法來找這個遊戲的必勝策略。
1. 【演算法講堂】【電子科技大學】【acm】博弈論基礎
2. acm 博弈論基礎
我的部落格原文:
kingfish404 - blog acm-博弈論基礎blog.achacker.com
ACM整數的尾數
time limit 1 sec memory limit 128 mb submit 73 solved 19 submit status bbs 乙個整數,只知道前幾位,不知道末二位,被另乙個整數除盡了,那麼該數的末二位該是什麼呢 輸入資料有若干組,每組資料報含二個整數a,b 0 a 10000...
ACM 整數劃分(四)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述問題是我們經常見到的整數劃分,給出兩個整數 n m 要求在 n 中加入m 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入第一行是乙個整數t,表示有t組測試資料 接下來t行,每行有兩個正整數 n,m 1 n 10 19,0 m...
acm 大整數專題
用string類存大整數,之後用陣列來存大整數的每一位 vector stl容器 向量 vector,變長陣列,倍增的思想 size 返回元素個數 empty 返回是否為空 clear 清空 front back push back pop back begin end 支援下標運算子 支援比較運算...