这次,我们来继续学习博弈论的知识。今天我们会学习更多的基础模型,以及SJ定理的应用。

首先,我们来看博弈论在DAG上的应用。首先来看一个小例子:在一个有向无环图中,有一个棋子从某一个点开始一直向它的出点移动,双方轮流操作,无法操作者输,问是否先手必胜。

考虑一下我们之前的Nim游戏,如果我们把后继状态看成后继点的话,不难发现Nim游戏的互相转移也是一个DAG。因此,DAG上出度为0的点的sg值为0,再用上一篇博客提到的mex操作来求每个点的值就可以了(注意,这并不是一个“大”子图,不能拆成子游戏,因此不能异或了!)。在图上的递推操作是O(n)的,按照逆向拓扑序递推即可;如果有向无环图有多个,又怎么办呢?那么显然这个时候就可以异或了,直接计算即可。

接下来,我们来看一种Anti-SG游戏。顾名思义,这种游戏和一般的SG函数游戏不太一样:在这种游戏中,最后不能行动的人反而是赢家。那么现在怎么判断一个状态是N-Position(必胜)还是P-Position(必败)呢?

首先,很显然,如果有奇数个大小为1的石子堆,则先手必败;如果有偶数个,则先手必胜。

接着,我们从最简单的情况开始考虑,石子堆全是1的状态,肯定是由恰好有一个石子堆大于1个的状态走过来的

那么,谁拿到了这个状态,谁就能获胜。因为拿到这个状态的人可以通过控制最大那堆石子剩下的个数(1个或者0个)来使自己必胜

那么我们继续考虑。如果有一个人可以拿到这个先手必胜的状态,他一定是在初始状态是就“先手必胜”了。而初始状态的“先手必胜”和上一条的“先手必胜”意义不同:这里的初始状态先手必胜,指的是他能控制游戏的走向,从而使自己能拿到想要的状态,因此这里的“先手必胜”和Nim游戏一样,要求子游戏异或和大于0即可;而在拿到上述恰好有一个石子堆大于1个的状态之后,他一定是必胜的。

因此,只要初始的石子状态不是全为1,我们仍然可以用Nim的异或和做法来判断;而当状态全是1时,我们直接根据堆数奇偶判断即可。上面这些东西的学名就叫做“SJ定理”。如果不是取石子游戏,而是其他不确定sg计算方法的游戏(有向图游戏,台阶游戏……均可),我们可以先假设不能移动者赢,求出sg函数计算式,再利用SJ定理转化求解。

接下来,我们再来看一种新游戏模型:Muitl-SG游戏。这种游戏允许取走某些东西后,使原游戏呗分成几个新游戏。我们来看一道小例题:有n排石子,每次要从其中的一排中取出相邻的两个石子。无法操作者输。

这种问题如何操作呢?不难发现,在取走这两个石子后,原来的大游戏的后继状态变成了2个(或1个)子游戏。而我们知道,在符合条件时,异或可以对子游戏进行加和操作。所以,这个大游戏的后继状态的sg值,就是这个后继游戏状态中新产生的石子堆sg值的异或和,然后我们对后继状态的sg值再取异或和,就得到了这个大游戏状态的sg函数值。

我们再看一个更加复杂一点的游戏:Every-SG游戏。这种游戏除了是输赢的博弈之外,还是时间的博弈。我们看一道小例题:

有n个同时进行的游戏,每次都必须在还未结束的游戏中进行一步操作,不能在任何游戏里操作的人输。很明显,这个游戏的胜利在于不断在必胜的游戏中续命拖长时间,在必败的游戏里速战速决。那么我们可以在递归搜索时额外加入如下的语句,维护从这个游戏状态开始,最长的持续时间:

对于必胜状态的步数要最大化,必败状态的步数要最小化,双方都是如此。

显然,先手必胜局面的步数一定是奇数,所以所有游戏中,最长步数若是奇数,先手必胜,否则先手必败。

今天我们介绍了4种博弈论的经典模型,并且还引入了SJ定理这一新的工具。下一次,我们会结合不同模型的经典例题来继续了解博弈论这个神奇的知识点。希望我的博文给你带来了帮助~:)

[您有新的未分配科技点]博弈论进阶:似乎不那么恐惧了…… (SJ定理,简单的基础模型)的更多相关文章

  1. [您有新的未分配科技点]博弈论入门:被博弈论支配的恐惧(Nim游戏,SG函数)

    今天初步学习了一下博弈论……感觉真的是好精妙啊……希望这篇博客可以帮助到和我一样刚学习博弈论的同学们. 博弈论,又被称为对策论,被用于考虑游戏中个体的预测行为和实际行为,并研究他们的应用策略.(其实这 ...

  2. [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...

  3. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  4. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解

    这一次,我们来了解普通Trie树的变种:0-1Trie以及在其基础上产生的可持久化Trie(其实,普通的Trie也可以可持久化,只是不太常见) 先简单介绍一下0-1Trie:一个0-1Trie节点只有 ...

  5. [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)

    只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...

  6. [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)

    数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...

  7. [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

    这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...

  8. Elasticsearch 学习之 分片未分配原因

    分片未分配的原因主要有: 1)INDEX_CREATED:由于创建索引的API导致未分配.2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配.3)INDEX_REOPENED :由于 ...

  9. centos7 挂载未分配的硬盘空间

    =============================================== 2019/7/28_第1次修改                       ccb_warlock == ...

随机推荐

  1. CF 987 D. Fair

    D. Fair http://codeforces.com/contest/987/problem/D 题意: n个城镇m条道路,(保证没有重边,两个城镇间可以到达),每个城镇拥有的特产ai(可能多个 ...

  2. Win SERVER 2008 许可证激活失败,系统重启问题

    服务器系统win server2008 R2 SP1,频繁重启,查看日志 有显示 许可证激活(slui.exe)失败,错误代码如下:0x800401F9 和 Windows 许可证激活失败.错误 0x ...

  3. ES6 localStorage 类库

    无意中看到的,记录下. 用到了es6语法.支持在js中写构造函数 class CovLocalDB { constructor (name) { this.LS = null this.name = ...

  4. 【MySQL函数】replace()函数

    1.replace()函数 语法:replace(a,b,c) a的b部分被c替换 案例:select replace(abcde,bcd,123)-- 结果a123e

  5. 「Leetcode」975. Odd Even Jump(Java)

    分析 注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题.换句话说,就是对于一个数\(A_i\),比它大的最小值\(A_j\)是谁?或者反过来. 这里有两种方案,一种是单调栈,简单 ...

  6. python练习---小脚本

    一.爬子域名 #!/usr/bin/python # -*- coding: utf-8 -*- import requests import re import sys def get(domain ...

  7. python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for

    也愿大家永葆初心-- 已识乾坤大,犹怜草木青. 一.python简介 首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算 ...

  8. Unity FSM 有限状态机

    翻译了一下unity wiki上对于有限状态机的案例,等有空时在详细写一下.在场景中添加两个游戏物体,一个为玩家并修改其Tag为Player,另一个为NPC为其添加NPCControl脚本,并为其将玩 ...

  9. 阿里云服务器Centos上Apache安装SSL证书配置Https

    首先我们先去阿里云申请一个免费的SSL证书(https://common-buy.aliyun.com/?spm=5176.7968328.1266638..5e971232BzMSp5&co ...

  10. python程序设计——面向对象程序设计:继承

    继承是为代码复用和设计复用而设计的 在继承关系中,已有的.设计好的类称为父类或基类,新设计的类为子类或派生类 派生类可以继承父类的公有成员,但不能继承其私有成员 如果需要在派生类中调用基类的方法,可以 ...