博弈论——SG定理(函数)

基础:
1.NP状态
N(next):此状态的先手必胜;
P(perv):此状态的后手必胜;
2.游戏的和
如果G1和G2 是公平游戏,那么他们的和G1 + G2是另一个公平游戏,玩法如下:每个回合,一个玩家选择G1, G2 中的一个(随便哪个他希望的)然后玩它,不碰另一个游戏。当 G1 和 G2都不能操作时游戏结束。

Sprague-Grundy 函数:
状态v的Grundy值(我更习惯叫SG值)等于没有在v的后继状态的Grundy值中出现的最小自然数。
∴结束状态的Grundy值为0.

计算SG值:(最简单的拿石子,take为每次可拿的石子数)

memset(sg,0,sizeof sg);
for(int i=1,j;i<MAXS;i++)
{
    memset(vis,0,sizeof vis);
    for(j=1;j<=tn;j++)
        if(i>=take[j])
            vis[sg[i-take[j]]]=1;
    for(j=0;vis[j];j++);
    sg[i]=j;
}

SG值的一些性质:
1.sg[i]==0说明i是P状态,sg[i]>0说明是N状态;
∵sg[I]>0说明I能走到sg值为0~I-1的所有状态,而结束状态一定是0,所以I是N状态;
∴sg[I]==0说明i不能走到任何sg为0的点,所以为P状态。
2.如果G = G1 + G2 且 v = v1v2 是G的一个状态,那么sg(v) 为sg(v1) 和 sg(v2) 在二进制下的异或:sg(v) = sg(v1) ⊕ sg(v2).
(证不来。。。)

可以解决很多问题:
(待完成)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值