转载的 博弈

 

 

这两天终于从失败的阴影中走出来,开始总结以前走过的路,具体的一些想法过两天我应该会贴出来吧~

被集训队淘汰已经成为事实,与其消沉不如好好反思,抓紧时间弥补自己的弱点

ACM我是不会放弃的,路还很长,加油!

 

博弈问题一直是我的一块软肋,搞了一年的ACM,碰到博弈基本都是束手无策,因为这类问题的特点就是思维难度比较高,需要数学功底和归纳推理的YY能力,以前看到博弈都不会认真去思考,并不是无法思考,而是没有耐心去想,所以在这一块上一直没有进步,我想这也是我失败的一个重要原因

这两天在自习室静心看了OI国家集训队的三篇论文,分别出自是09年贾志豪,02年张一飞,07年王晓珂三位神牛,论文以经典的NIM取石子游戏为基础介绍了博弈论的基本思想以及SG函数的应用

贴一点自己的收获:

在博弈论的题目里面,对于每一个状态,胜负都是确定的,要么必胜,要么必败,于是有这样一个显而易见的结论:

对于必胜态,必定存在至少一种走法,使得留给对手的下一种状态是必败态;

对于必败态,无论选择何种走法,留给对手的下一种状态都是必胜态;

这个结论非常浅显易懂,但却是解题的重要基础,一些题目可以直接运用这个结论加上搜索即可求出答案

接下来就是SG函数,定义我就不贴了,直接上一些很有用的性质:

=======================

游戏的和:考虑任意多个同时进行的SG-组合游戏,这些SG-组合游
戏的和是这样一个SG-组合游戏,在它进行的过程中,游戏者可以任意
挑选其中的一个单一游戏进行决策,最终,没有办法进行决策的人输。

每一个简单SG-组合游戏都可以完全等效成一堆数目为K
的石子,其中K 为该简单游戏的SG 函数值。这样的等效是充要的。

在我们每次只能进行一步操作的情况下,对于任何的游戏的和,我
们若将其中的任一单一SG-组合游戏换成数目为它的SG 值的一堆石子,
该单一SG-组合游戏的规则变成取石子游戏的规则(可以任意取,甚至
取完),则游戏的和的胜负情况不变。

=====================

在学习SG函数的过程中,游戏的和我看了很久,这一块确实相当经典,把一个大的游戏拆分成n个单独的游戏,然后分别求出每个单独游戏的SG值,最后异或起来就是游戏的和的SG值,这个方法在后面解决博弈题目的时候非常有效

 

今天中午看得差不多了,开始在ZOJ上搜博弈题,先搜NIM,再搜game,博弈的题目确实都很经典,想不出来就完全无法下手,想出来了基本上都是1A,最后AC了7题,贴下题目链接

Run IDSubmit TimeJudge StatusProblem IDLanguageRun Time(ms)Run Memory(KB)User Name
22530092010-08-06 21:56:48Accepted 2290C++0264死肥羊@BigMonster
22525422010-08-06 15:24:31Accepted 1827C++0244死肥羊@BigMonster
22524762010-08-06 14:32:19Accepted 2083C++0184死肥羊@BigMonster
22524602010-08-06 14:19:51Accepted 3057C++169026816死肥羊@BigMonster
        
22524262010-08-06 13:30:45Accepted 3084C++340232死肥羊@BigMonster
22524052010-08-06 12:39:10Accepted 2507C++0204死肥羊@BigMonster
22524042010-08-06 12:30:40Accepted 3113C++0204死肥羊@BigMonster

 

以下是简单的解题报告

zoj 2290

题目大意就是给N个石子,AB两人轮流取,A先取,A第一次取的时候可以取任意数量的石子(但不能一次取完),这之后每次取石子的那个人取的石子数量不能超过另一个人上次取的数量的2倍,比如某一次A取了4颗,那么接下来B最多只能取8颗,取走最后一颗的人获胜

这题我没有想出SG函数或者能够用数学证明的解法,我是直接打表列出100颗以内的所有解,然后找的规律,注意有些情况下A必须上手就全部取完,这是违反规则的,所以输出lose

zoj 1827

24张扑克牌,牌面数值从1到6各四张,两个人轮流出牌,必须保证出掉的所有牌的总和不超过31,无法出牌的人输,现在给出两个人之前进行的部分游戏(也就是两个人已经轮流出了一些牌了),要判断是谁是必胜的

这题不需要SG函数,直接利用必胜必败相互转化的原理,开6维数组然后用dp的方式更新到起点即可,注意一点:对于出牌大于31的局面应该是先手必胜态~

zoj 2083

这是一道比较经典的SG函数题,过的人很少,我也是受了贾志豪大牛论文的启发才想出解法的

题目大意:n条线段(假设长度单位为米),AB轮流给线段染色,每次染的时候只能固定染2米,而且必须染没有染过的线段区间,没有线段可染的人输

这题初看的时候感觉就是普通的Nim问题,只不过取任意颗石子的规则变成了只能取2颗,但题目还有一个隐藏条件,染的是线段,所以可能出现染色之后,线段被“截”成两段的情况,比如长度为4的线段,如果染中间的话,就截成2根长度为1的线段了,所以这题的特点就是一个单一游戏的后继可以为多个单一游戏~

但根据拓扑原则,SG函数的性质在这里同样适用,我们首先求出每条单一线段的SG函数值,再求异或即可~在求单一线段的SG函数值的时候,要枚举所有可能的染色情况,然后如果出现截成两段的情况,要对这两段的SG值做异或,整个过程可以用记忆化搜索来做

zoj 3057

跟1827差不多,也是直接利用必胜必败的相互转化,从最终态往初始态递推,对于必败态,它的所有祖先状态都是必胜态,而必胜态则不用再往前推导~

zoj 3084

S-Nim,NIM问题的变形,取石子规则由原来的任意取变成了只能取几个特定的数字(这些数字在一个集合里给出),很明显这里不能再直接使用NIM问题的结论,把所有石子个数求异或是错误的~但只要清楚SG函数的意义,这题其实与NIM是一个道理,首先求出每种数量石子的SG函数值,直接按照SG函数的定义来求即可,需要记忆化,有了SG函数值之后,再把每堆石子的SG函数值取异或即可

zoj 2507

NIM问题变形,规则变成了最后取石子的人输

这里可以参考贾志豪大牛的SJ定理

对于任意一个Anti-SG游戏,如果我们规定当局面中所有的单一游戏的SG值为0时,游戏结束,则先手必胜当且仅当:(1)游戏的SG函数不为0且游戏中某个单一游戏的SG函数大于1;(2)游戏的SG函数为0且游戏中没有单一游戏的SG函数大于1。

zoj 3113

和2507类似,Anti-SG

 

 

 

=====================================

下面这3道题我想了一个晚上也没头绪,大牛有兴趣的话指点一下吧O(∩_∩)O

2804Funny Games

2725Digital Deletions

2686Cycle Game

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值