zoukankan      html  css  js  c++  java
  • sg函数总结

    http://blog.csdn.net/luomingjun12315/article/details/45555495

    这一段时间写的题和我接下来要展示的一些概念都来自这里↑。

    必胜点和必败点的概念
           P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。
           N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。
     
    必胜点和必败点的性质
            1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设)
            2、从任何必胜点N 操作,至少有一种方式可以进入必败点 P。
            3、无论如何操作,必败点P 都只能进入 必胜点 N。
     
    Sprague-Grundy定理(SG定理): 
      游戏和的SG函数等于各个游戏SG函数的Nim和(异或和)。这样就可以将每一个子游戏分而治之,从而简化了问题。而Bouton定理就是Sprague-Grundy定理在Nim游戏中的直接应用,因为单堆的Nim游戏 SG函数满足 SG(x) = x。
     
    SG函数
            首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
            对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如 x 有三个后继状态分别为 SG(a),SG(b),SG(c),那么SG(x) = mex{SG(a),SG(b),SG(c)}。 这样 集合S 的终态必然是空集,所以SG函数的终态为 SG(x) = 0,当且仅当 x 为必败点P时。
     
     
     
    我的理解:
    试想一个博弈以不能操作为输,后手的保证胜利大多数基于对称方案,也就是说,对于先手的每一步,后手都有对应的步,异或同0异1刚好解决这个问题。
    我对mex运算的理解是这是一种分层,各种取数方法博弈的dp停留在必胜必负这一层,如果多个类似的游戏综合起来就会有http://poj.org/problem?id=2425这棵树一样会有一些有很多分支的节点。sg函数的mex操作完成了节点的分层,然后再进行游戏的前后手操作匹配,异或和如果为0则表明后手对先手的每一步都能匹配,此时后手必胜。
     
    其实我觉得这个理解并不是很重要,直接套板子也能写,但是我不知道原理就会浑身难受所以。。还是找了资料大概理解了一下原理。

  • 相关阅读:
    eclipse常用快捷键
    Android 布局
    Android UI设计
    Android Context 是什么?
    内部类
    手写单例模式
    上课笔记:移动开发新利器-你好,Flutter
    Android Fragment
    Kotlin语言
    Android虚拟机和类加载机制
  • 原文地址:https://www.cnblogs.com/137shoebills/p/8087069.html
Copyright © 2011-2022 走看看