博弈论总结

最近做的题目看到了博弈论,看见别人做出来了,但是自己无能为力感觉好难受啊,特别是在队伍里面有种用处局限于那么一丢丢考不上的数论的感觉……真的很难过,哎,看完了博弈论就去看别的题目吧,实在受不了一无所知,好像毫无长进的自己了,尤其是看深搜之类的,这种东西就是那种所有人(反正我自己就是不喜欢的)都不喜欢打的代码!还有一些思维题目、很让人眼熟的题目啦~

博弈论好像是跟dp有关的,所以当初看的时候特别~~不想看,不过怎么说也是自己看的范畴!!就算看不懂也要好好研究哈~

在这里,我将总结一下我所见到的博客里面的博弈论的知识以及入门题目,就现在我的水平来说,做出高难度的题目的可能性还是不是很大的,所以我打算做出符合自己的本事的选择——先研究好理论知识,然后看好一些比较简单的例题,懂得最简单的模板使用或者模板的简单变形就好啦~~毕竟嘛,还是其他的大小考核的几率大一点儿,而且还相对而言比起天天看的数论……还有点残留的新鲜感!

一般训练中会遇到的有几种,巴什博弈,威佐夫博弈,尼姆博弈,斐波那契博弈等,这里将进行分别的介绍~(算法书上面的是SG函数,因为看不懂,所以木看,在博客上找找好啦~~)

预计,,这周的周末就可以看见这篇文章啦(先给自己立个flag,不能打脸)。

一,巴什(Bash)博弈

题目模型:一堆物品,共n个,两个人轮流拿,每个人最少拿一个,最多拿m个,最后一个取球的人胜利(第一个取不到球的失败),两个人都会取会让自己胜利的最优策略(也就是相当于知道了解题技巧,知道了取到什么局面自己必胜)。

解题思路:

①如果n=m+1,无论先手拿几个球,都会出现后手必胜的局面

②所以,如果有一方面对着n%(m+1)==0,那么他必输(此局面由于另一人最优策略,这一局面将会被保持到最后变成m+1个球儿)。

③所以想要先手取胜,就必须将m+1倍数的余数给拿走,这样的话,后手必定面对必败的局面啦~~

代码:

if(n%(m+1)==0)  cout<<"后手必胜"<<endl;  
else cout<<"先手必胜"<<endl;  

例题:

(1)51nod 1066 Bash游戏  标准巴什模板题目,很好理解,入门必备

(2)hdu 4764 Stone  有点变形,写数字,第二个人写的数字必须第一个人大1~k,谁写的数字大于等于n将会输掉比赛。如果n=1,那么先手必输,如果n>2&&n<=k+1,那么先手必赢(先手可以写道差一个=n),那么综上,只要n-1是k+1的倍数,那么先手就能将游戏变成每一部分都是他必赢的局面啦~~

二,威佐夫博弈(??奇异局势)

题目模型:有两堆若干物品,一个人可以从一堆中取1~无穷个物品,或者从两堆中同时取相同件物品,取到最后一件的人胜利。

解题思路(摘自:https://www.cnblogs.com/zhangmingzhao/p/7256631.html):

①用(a,b)表示某个人面对的局势,当他面对(0,0)时,他就失败了,这种局势被称为奇异局势

②前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

③可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,奇异局势有如下三条性质:

有些操作看不懂!!

1.任何自然数都包含在一个且仅有一个奇异局势中。由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。

2.任意操作都可将奇异局势变为非奇异局势,事实上,若只改变奇异局势(ak,bk)的某一个分量,(0,x)必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,奇异局势的差各个不同,因此也是非奇异局势。

3采用适当的方法,可以将非奇异局势变为奇异局势。

假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0);

如果a = ak ,b > bk,那么,取走b  – bk个物体,即变为奇异局势,差为0的那种;

如果a = ak,b < bk ,则同时从两堆中拿走 ak – ab – ak个物体,变为奇异局势( ab – ak , ab – ak+ b – ak);

如果a > ak,b= ak + k,则从第一堆中拿走多余的数量a – ak 即可;

如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k)从第二堆里面拿走 b – bj 即可;第二种,a=bj (j < k),从第二堆里面拿走 b – aj 即可。

④从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

⑤判断是否是奇异局势的方法是:利用下述函数

 ak=[k(1+√5)/2],bk=ak+k(这个求k) (k=0,1,2,…,n 方括号表示取整函数)。

if (a > b)
    swap(a,b);
m = b - a;
k = (int)(m * (1 + sqrt(5)) / 2.0);
cout<<a == k ? "B" : "A";//满足条件,即是奇异局面,后手必胜,反之先手必胜

例题:

51nod 1072 威佐夫游戏 标准模板例题

51nod 1185 威佐夫游戏v2 (改动:N特别大),如果数据在10^6左右才可以直接带模板做,在这里10^18不能这么用了,(听说java可以开大数?),这里将(V5+1)/2的小数部分用数组分开存了起来,运用了大数乘法模拟……哈哈~这都是啥呀!!介个嘛,,,咳咳咳,先放放。

三,Nim 博弈

题目模板:有任意堆物品,每个人从一堆中最少拿一个,最多拿无限个,取到最后一件物品的人取胜。

结论:额,布吉岛为啥几乎没有写推导过程的,可能是太难了。

对于一个Nim游戏的局面(a1,a2,a3……an),它是奇异局势(P-position)当且仅当a1^a2^a3……^an=0,此时先手必败,否则先手必胜。这个应该就是算法书上写的博弈的内容啦

变形:auti-Nim博弈:

区别在于,谁拿了最后一个谁输。

先手胜,当且仅当 ①所有堆石子数都为1且游戏的SG值为0(即有偶数个孤单堆-每堆只有1个石子数);②存在某堆石子数大于1且游戏的SG值不为0。

因为我们发现偶数个石子堆时,最后一个拿的是后手,此时SG为0,但是先手胜利(要是拿着最后一块胜利则是不需要变形的了。

四,斐波那契博弈

题目模板:有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。

结论:先手获胜当且仅当物品数目不是斐波那契数列。

五,环形博弈

题目模板:n个石子围成一个环,每次取一个或者取相邻的2个。

结论:石子数目小于等于2 先手胜,其他 后手胜。

六,对称博弈

题目模板:n个石子围成环,每次只能取相邻的1 - k个

结论:

①如果k < n:对k=1,如果n能被2整除,则后手赢如果k>1,后手赢(先手取什么位置后手就取对称的位置,这样保证后手永远能取到)

② 如果k>=n:先手赢.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值