初學博弈論受益匪淺,將個人的博弈論解題總結一下。
1.威佐夫博弈論(證明真的沒有的離散數學技巧是絕對
1)問題:首先有兩堆石子,博弈雙方每次可以取一堆石子中的任意個,不能不取,或者取兩堆石子中的相同個。先取完者贏。
解題思路:說實話對這種題唯一的方法是打表,當然比賽時候打表不好搞,盡量將新的狀態轉到老的已確定的狀態,然後再找規律。
(0,0)(1,2)(3,5)(4,7)(6,10)……
規律的確是挺神奇的
ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括號表示取整函式),
這個狀態先手必敗。
2)關於這個博弈論的定理與規律。
每行第乙個數恰巧是前面每一行中沒有出現過的最小正整數
在所有的必敗態中,每個數字恰巧出現一次。。。。。。。。2
解題時會問你先手勝的話如何走第一步,根據.。。。。2可以去求,當然當(4,6)時這種方法不行,只能兩邊同時去取。(根據差值去取)。
當然證明我也可以闡述一下,畢竟學acm的,如果這個都不掌握的話,太對不起威佐夫這個人了,他貌似畢生貢獻都在這乙個博弈上面了,如果我只用找規律解決的話,有愧於先人啊。(在本文最後說明,畢竟本文最重要的還是要解決acm中的博弈類題目)。
2.nim遊戲
這類題目acm中還是挺多的。
先來描述一下最基礎的nim遊戲吧。
1)基礎nim
有若干堆石子,每堆石子的數量都是有限的,合法的移動是「選擇一堆石子並拿走若干顆(不能不拿)」,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因為他此刻沒有任何合法的移動)。
結論:每個數量異或之後如果為0,則先手必輸。
2)nim引申
將上面的每堆可取石子數限定為乙個集合s;其他同上;
sg函式:
sg(x) = mex ( sg(y) |y是x的後繼結點 )
其中mex(x)(x是乙個自然是集合)函式是x關於自然數集合的補集中的最小值,比如x= 則mex(x)=3;
什麼是後繼結點?
所謂後繼結點就是當前結點經過乙個操作可以變成的狀態。比如對於娶4石子遊戲,假如每次可以取的數目是1,2,4,當前的石子數目也就是當前狀態是5,那麼5的後繼結點就是=;
思考:hdu1848
每個堆點的可取數目是有限定的,這該怎麼辦呢?
sg=mex|x是y的子節點}
那麼sg=sg(t為斐波那契數列中的數)。
5 #include6取走-分割遊戲using
namespace
std;78
#define max 10059/*
10計算從1-n範圍內的sg值。
11array(儲存可以走的步數,array[0]表示可以有多少種走法)
12array需要從小到大排序
13/*hdu1847博弈sg函式
141.可選步數為1-m的連續整數,直接取模即可,sg(x) = x % (m+1);
152.可選步數為任意步,sg(x) = x;
163.可選步數為一系列不連續的數,用getsg(計算)
17*/
18int
sg[max], hash[max];
19int
array[max];
20void getsg(int array, int n = max-1)21
33for(j = 0; j <= n; j++)
3440}41
}42}43
intmain()
4453 array[0] = i - 1;54
getsg(array);
55while(cin>>m>>n>>p &&m)
56
61return
0;
62 }
這種遊戲允許取走某些東西,然後將原來的乙個遊戲分成若干個相同的遊戲。
例1、lasker』s nim遊戲:每一輪允許兩種操作之一。(1)從一堆石子中取走任意多個(2)將一堆數量不少於2的石子分成都不為空的兩堆。
分析:很明顯,g(0)=0,g(1)=1。狀態2的後繼有0,1和(1,1),它們的sg函式值分別是0,1和0,所以g(2)=2。狀態3的後繼有0,1,2和(1,2),它們的sg函式值分別是0,1,2和3,所以g(3)=4。狀態4的後繼有0,1,2,3,(1,3)和(2,2),它們的sg函式值分別是0,1,2,4,5和0,所以g(4)=3。在推一些,我們得到:
我們推測:對於所有的k>=0,有g(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3。
請自行證明。
假設遊戲初始時有3堆,分別有2、5和7顆石子。三堆的sg函式值分別是2、5和8,它們的nim和等於15。所以要走到p狀態,就要使得第三堆的sg值變成7,可以將第三堆分成按1和6分成兩堆。
3.對稱博弈
男人八題中的取石子問題。
走格仔問題
4.k倍增長博弈
5.翻硬幣
6.其他雜題
看做題經驗了這些題目。
7.24點很多時候題目會要求你求24點,這其實也可以算是博弈論中的一種,只不過是對手只有自己乙個人,這往往需要數學靈感。這類題目一般要列舉各種情況並且歸納幾種相類似的情況。例如hdu 1427:
這題目需要dfs就夠了。
#include#include#include#include#include#include#include#include#include#define inf 99999999
using namespace std;
const int max=5;
char s[3];
int number[max];
bool flag;
void check(char ch,int &num)
} if(ch == '1')num=10;
}int f(int a,int op,int c)
bool calculate(int i,int j,int k)
void perm(int k)
return;
} perm(k+1);
for(int i=k+1;i<4;++i)
}int main()
flag=false;
perm(0);
if(flag)printf("yes\n");
else printf("no\n");
} return 0;
}
這是比較簡單的24點,例如15年多校hdu5308,這個是需要將前面情況進行列舉以及歸納的當n大於等於15的時候就是可以分奇偶兩種情況來討論歸納。這題如果按照前面搜尋來做的話不僅不好記錄運算過程,還鐵定超時間。
例如還有cf468a題和hdu5308做法有些類似。但比上面一題好寫很多。
#include #include using namespace std;
int main()
else
}return 0;
}
附錄:
1的證明:
ACM博弈論總結
常用的4個博弈論演算法 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。顯然,如果n m 1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如...
ACM之博弈論總結
現在自己做 博弈論的題目也做了很長時間了,自己把自己做過的題目和感覺常出現的型別總結一下。1.巴十博弈 這個是最基本的博弈型別。公式很簡單,n m 1 0?lost win 變式 最少取p個,最多去q if n p q 0 printf win n else if n p q p printf lo...
acm博弈論基礎
一 bash game 巴什博弈 一堆n個物品,兩個人輪流從中取出1 m個,最後取光者勝 不能繼續取的人輸 1,分析 首先n一定可以表示為 n k m 1 r 0 r m 二 wythoff game 威佐夫博弈 有兩堆各若干物品,兩個人輪流從任意一堆中至少取出乙個或者從兩堆中取出同樣多的物品,規定...