現在自己做 博弈論的題目也做了很長時間了,自己把自己做過的題目和感覺常出現的型別總結一下。
1.巴十博弈
這個是最基本的博弈型別。
公式很簡單,n%(m+1)==0?lost:win
變式:最少取p個,最多去q ,
if
(n%(p+q)==0)
printf
("win\n"
);else
if(n%(p+q)<=p)
printf
("lost\n"
);else
if(n%(p+q)>p)
printf
("win\n"
);
2.威佐夫博弈
每個t態是可以求出來的,用公式
if(a>b) a=a^b^(b=a);
double temp=double(b-a)/2.0*(sqrt(5)+1);
if(a==int(temp)) printf("0\n");
else printf("1\n");
3.nimm
異或為0是必敗態
變式:anti_nimm
int n;
cin>>n;
int num=0;
int num1=0;
int num2=0;
while(n--)
if(num&&num2) //s2,s1態,必勝
cout<<"john"<
變式:階梯博弈
//poj 1704階梯博弈化為nimm
#include#include#include#include#include#include#include#include#include#includeconst int max=0xfffffff;
using namespace std;
int a[1010];
int main( )
sort(a,a+n); //初始資料沒有排序trick1
int sum=0;
a[-1]=0;
for(int i=n-1;i>=0;i-=2) //倒著取奇數,不知道為什麼
sum^=a[i]-a[i-1]-1;
if(sum) cout<<"georgia will win"<
ACM博弈論總結
常用的4個博弈論演算法 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。顯然,如果n m 1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如...
acm博弈論基礎
一 bash game 巴什博弈 一堆n個物品,兩個人輪流從中取出1 m個,最後取光者勝 不能繼續取的人輸 1,分析 首先n一定可以表示為 n k m 1 r 0 r m 二 wythoff game 威佐夫博弈 有兩堆各若干物品,兩個人輪流從任意一堆中至少取出乙個或者從兩堆中取出同樣多的物品,規定...
ACM博弈論基礎
博弈論的題目有如下特點 有兩名選手 兩名選手交替操作,每次一步,每步都在有限的合法集合中選取一種進行 在任何情況下,合法操作只取決於情況本身,與選手無關 遊戲敗北的條件為 當某位選手需要進行操作時,當前沒有任何可以執行的合法操作 下面介紹幾個經典的博弈。一堆n個物品,兩個人輪流從中取出1 m個,最後...