博弈 SG函数

为什么要学习这个呢?因为每次看到题解的第一句话总是这种的:

水题,简单题,模板题,打表题

然后,第二句话,就是结论,比如sg【x】等于(然后一个分类),就得到了公式

最后就是把所有的亦或起来,就得到了答案了


首先呢,可以把这个题做一做,是一个很好的博弈题。题目链接:HDOJ5754

HDOJ5754题解


这个题,解释了博弈的很经典一个思路:找平衡

什么叫做平衡?就是当博弈的局面达到了对称的时候,后手总是可以模仿先手的操作,从而让先手失败

而先手要是想要获胜,那么第一步必须建立对称局面


博弈中的另外一个很重要的思路是P局面和N局面,官方定义和解释如下:

(1)无法进行任何移动的局面是P局面

(2)可移动到P局面的局面是N局面

(3)所有操作都导致N局面的局面是P局面

P局面就是常说的必败态,N局面就是常说的必胜态

也就是说:必败态就是无路可走,或者下一步状态都是必胜态

必胜态的下一步状态至少有一个是必败态


现在来定义SG函数,函数g(x)=mex【g(y)】,其中y是x的后继

mex是一种运算,表示的含义是:最小的不属于这个集合的非负整数

例如mex【0,1,2,4】=3,mex【】=0,mex【2,3,5】=0

这就给我们打表提供了理论依据,如何判断一个状态x的结果,只需要根据mex函数,去求他的所有子状态y的结果


相信其他的博客有更好的理论解释

我这里提供几个打表的例题,打表的过程和原理会详细解释


POJ2425

因为博弈的状态转移关系是不定的,需要根据输入动态调整

原理是要求sg(x),先得算出所有的sg(y),所以用记忆化搜索

sg(x)的函数值,是mex【sg(y)】,所以把sg(y)放到mex数组中,然后从前往后找,找到第一个mex【i】=0的i值,即有sg(x)=i

POJ2425题解


HDOJ5795

状态转移分为两种情况,把一堆分成3堆,或者是把一堆取走任意个石子(不能不取),就是对于sg【x】,x的所有后继y怎么来

HDOJ5795题解


HDOJ3032

会了5795之后,这个题应该是改改就出来了吧

HDOJ3032题解


HDOJ1848

题中给定的转移数目是Fibonnaci数,需要提前计算有多少个可能值

在转移的时候,一定要记得选择拿走的Fibonnaci数不能超过当前的x

HDOJ1848题解


贴了几个题之后,总结下方法吧:

1:自己先手算几个结果,方便理解题意,方便打表

2:考虑可能的所有转移情况,根据SG函数的原理来打表

3:如果能够找到规律,那么直接用规律做

4:如果看不出规律,那么采取记忆化搜索的方式

5:总之,nim和SG函数都是比较套路的题,需要好好研究,比赛的时候是需要弄出来的题


uva10561

SG函数和NIM游戏中较难的变形题

uva10561题解

全部评论

相关推荐

12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务