初学博弈论

一、巴什博奕(Bash Game)

基本描述:

只有一堆n个石子,两个人轮流从这堆石子中取石子,规定每次至少取一个,最多取m个,最后取完的人获胜。

分析:

  1. 当n <= m的时候,显然先手获胜,因为一次就能取完。
  2. 当n = m+1 的时候,由于先手最多取走m个,无论其取走多少个,剩下的后手均可以一次取完,显然后手胜。
  3. 根据以上分析,我们可以将n写成 n = (m+1) * r + s 的形式。对于先手玩家,我们可以取走s个,给对方造成剩下(m+1) 整数倍的情形。此时无论对手取走多少个,假设对手取走k个, 我们一定可以做到取走 (m+1-k)个,此时剩下(m+1) * (r-1)个,那么留给对方又是(m+1)的整数倍,如此就可以保证 先手 取胜。

结论:

  1. 当 n <=m 时,先手必胜。
  2. 当 n % (m+1) = 0时,后手必胜。
  3. 当 n % (m+1) != 0时,先手必胜。

其中上述的情况1和3可以合并,故:

  1. 当 n % (m+1) = 0时,后手必胜。
  2. 当 n % (m+1) != 0时,先手必胜。

注意:

  1. 变形玩法:两个人轮流报数,每次至少1个数,最多报10个数字,谁先报到100取胜。

练习:

  1. HDU 1846
  2. HDU 2149
  3. HDU 2188
  4. HDU 4764

二、PN点分析

什么是PN点

  1. P点,即必败点。前一个选手(Previous player)将取胜的位置称为必败点。
  2. N点,即必胜点。下一个选手(Next player)将取胜的位置称为必胜点。

PN点的属性

  1. 所有终结点均为必败点(P点);
  2. 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);
  3. 无论如何操作,必败点(P点)都只能进入必胜点(N点)。

分析步骤

  1. 将所有终结位置标记为必败点(P点);
  2. 将所有一步能进入必败点(P点)的位置标记为必胜点(N点);
  3. 如果从某个点开始的所有一步操作都只能进入必胜点(N点),则将该位置标记为必败点(P点);
  4. 如果在步骤3中未能找到新的必败点(P点),算法终止,否则返回步骤2.

结论

  1. 当行列都是奇数的时候,一定是必败点;
  2. 否则为必胜点。

注意

  1. 至于结论怎么推出来的,大家画一下3 * 4, 4 * 4, 3 * 3的PN分析图就知道了。

练习

  1. HDU 2147

三、斐波那契博弈

基本描述

有一堆个数为n的石子,游戏双方轮流取石子,满足:

  1. 先手不能再第一次把所有石子取完;
  2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间,包括1和对手取的石子数的2倍。
    取最后石子的人为赢家。

结论

先说结论:
当且仅当n不是Fibonacci数时,先手必胜。换句话说,先手必败构成Fibonacci数列。

分析

证明需要前置技能,“Zeckendorf定理”(齐肯多夫定理),其表述为:任何正整数可以表示为若干个不连续的Fibonacci数之和。

具体证明在这篇博文中给出,有兴趣的读者可以自行学习。

练习

  1. HDU 2516

四、威佐夫博弈

基本描述

有两堆各若干个石子,两个人轮流从某一堆或者两堆中取同样多的物品,规定每次至少取一个,多着不限,最后取完石子的人获胜。

分析

设这两堆石子分别有(A,B)个,并且A<=B。我们先来看一下先手必败的局势。

  1. (0,0) 先手必败,很明显他没得取了。
  2. (1,2) 先手必败。具体分析一下,先手有以下几种取法:
    取第一堆的1个,后手取走第二堆的2个获胜。
    从第一堆第二堆各取1个,后手取走第二堆剩下的1个获胜。
    取第二堆的1个,后手从第一堆第二堆各取1个获胜。
    取第二堆的2个,后手取走第一堆的1和获胜。
    综上所述,先手必败。
  3. (3,5) 先手必败。 首先可以明确的一点是,先手不能把任意一堆取完,如果取完显然必败。
    先讨论先手从第一堆中取的情况
    先手可以从第一堆中取1个,后手从第二堆中取4个,转化为(1,2),先手必败。
    先手可以从第一堆中取2个,后手从第二堆中取3个,转化为(1,2),先手必败。
    再讨论先手从第二堆中取的情况
    先手可以从第二堆中取1个,后手从两堆中各取2个,转化为(1,2),先手必败。
    先手可以从第二堆中取2个,后手从两堆中各取3个,转化为(0,0),先手必败。
    先手可以从第二堆中取3个,后手从两堆中各取1个,转化为(1,2),先手必败。
    先手可以从第二堆中取4个,后手从第一堆中取2个,转化为(1,2),先手必败。
    接着讨论先手从两堆中取的情况
    先手可以从两堆中各取1个,转化为(2,4),此时情况较多
    后手足够聪明,他从第二堆中取了1个,转化为(2,3),先手也足够聪明,他为了不直接输掉,从第一堆中取了1个(其他取法直接输掉了),转化为(1,3),此时后手从第二堆中取1个,转化为(1,2),先手必败。
    先手可以从两堆中各取2个,后手从第二堆中取一个,转化为(1,2),先手必败。
    综上所述,先手必败。
  4. 其他的先手必败局势
    (4,7),(6,10),(8,13),(9,15),(11,18).

  5. 我们将先手必败局势的集合,称为奇异局势。

奇异局势的性质

  1. 任何自然数都包含在一个且仅有一个奇异局势中。
  2. 任意操作都可将奇异局势变为非奇异局势。
  3. 采用适当的方法,可以将非奇异局势变为奇异局势。

Betty定理

我们可以发现,将所有奇异局势按照第一堆的石子的数目从小到大排列,每个奇异局势的差值是自然数列
进一步观察发现,对于一个奇异局势(A,B), A = 下取整[ (B-A) * 1.618 ],更准确的说,1.618 = (sqrt(5) + 1) / 2.

为什么会是这样的? 具体的证明涉及到Betty的定理,有兴趣的读者可以百度,这里不再赘述。

常见的几类问题

  1. 给出一个局面,判断先手输赢。
    检查是否是奇异局势。
  2. 给出局面,判断先手输赢,若赢,求出首步取法。
    由于差值是固定的,根据差值计算。

练习

  1. POJ 1067
  2. HDU 1527
  3. 51NOD 1072
  4. HDU 2177
  5. NYOJ 161

五、尼姆博弈

基本描述

有三堆石子, 每堆有若干个,两个人轮流从某一堆中任取石子,每次至少取一个,多者不限,最后取完者获胜。

分析

用(A,B,C)来表示某一特定局势,同时规定A<=B<=C。奇异局势表示先手必败。

  1. 显然(0,0,0)是奇异局势。
  2. (0,n,n)是奇异局势,当先手拿走s个石子时,我们对应拿走s个石子,最终转化为(0,0,0)。
  3. (1,2,3)也是奇异局势,无论先手如何取,我们都可以转化为(0,n,n)的局势。

对于一个奇异局势(A,B,C),我们可以发现,A(XOR)B(XOR)C = 0。
下面一条需要的前置技能
设有数字a,b,a(XOR)b(XOR)(a(XOR)b) = (a(XOR)a)(XOR)(b(XOR)b) = 0
对于一个非奇异局势(A,B,C),我们只需要将C转化为(A(XOR)B)即可,而将C转化为(A(XOR)B)的操作为,C = C-(A(XOR)B)即可。

注:

  1. 异或在C语言中的符号为^。
  2. 对于此情景来说,可以推广到N堆石子,奇异局势的条件为A1(XOR)A2(XOR)A3(XOR)……AN(XOR) = 0。
  3. A(XOR)B(XOR)B = A,可推广到N个变量,A1(XOR)A2(XOR)A3(XOR)……(XOR)AN(XOR)AN(XOR)AN-1(XOR)……(XOR)A3(XOR)A2 = A1;

练习

  1. HDU 1850

六、SG函数

基本描述

SG函数为计算博弈状态的函数,当SG[X] = 0时,说明先手必败。
为了求解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时。

说起来很抽象,举一个具体的例子来说明一下。

实例:取石子游戏

游戏规则:

有1堆n个的石子,每次只能取{ 1, 3, 4 }个石子,先取完石子者胜利,那么各个数的SG值为多少?

SG分析

SG[0] = 0(显然没有石子可取时必败);
f[] = {1,3,4}(表示每次取有3中方案,取1个,取3个,取4个);

当石子x = 1时,可以取走1-f{1}个石子,SG[1] = mex(SG[1-1]) = mex(0) = 1;
当石子x = 2时,可以取走2-f{1}个石子,SG[2] = mex(SG[2-1]) = mex(1) = 0;
当石子x = 3时,可以取走3-f{1,3}个石子,SG[3] = mex(SG[3-1],SG[3-3]) = mex(0,0) = 1;
当石子x = 4时,可以取走4-f{1,3,4}个石子,SG[4] = mex(SG[4-1],SG[4-3],SG[4-4]) = mex(1,1,0) = 2;

以此类推…

我们可以打出SG函数的表,根据表来判断是先手必胜还是先手必败。

练习

  1. HDU 1847
  2. HDU 1848

七、更多的练习

  1. POJ 2234
  2. HDU 4388
  3. POJ 2975
  4. HDU 1367
  5. POJ 2505
  6. ZOJ 3057
  7. POJ 2484
  8. POJ 2425
  9. POJ 2960
  10. POJ 1740
  11. POJ 1704
  12. POJ 2068
  13. POJ 3480
  14. POJ 2348
  15. HDU 2645
  16. POJ 3710
  17. POJ 3533

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式----Adapter(适配器)

作用: 将一个类的接口转换成客户希望的另外一个接口。Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 UML示意图 1)采用继承原有接口类的方式 2)采用组合原有接口类的方式 解析: Adapt模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起…

浅谈算法——博弈论

注&#xff1a;下列游戏都建立在双方都有最优策略的情况下&#xff0c;若未加以说明&#xff0c;则每人每次至少取一个石子。 例1&#xff1a;取石子游戏之一 有两个游戏者&#xff1a;A和B。有n颗石子。 约定&#xff1a;两人轮流取走石子&#xff0c;每次可取1、2或3颗。A先…

linux系统管理学习笔记之八---进程与作业的管理

linux系统管理学习笔记之八---进程与作业的管理 2010-01-05 13:00:42标签&#xff1a;linux 进程    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。ht…

C++中的srand(time(null))利用时间设置随机种子产生随机数

首先需要声明的是&#xff0c;计算机不会产生绝对随机的随机数&#xff0c;计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数&#xff0c;即使计算机怎样发展&#xff0c;它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数&#xff0c;即伪…

srand(设置随机数种子)

srand&#xff08;设置随机数种子&#xff09; 相关函数rand&#xff0c;random srandom 表头文件#include<stdlib.h> 定义函数void srand (unsigned int seed); 函数说明srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数&#xff0c;通常可以利用g…

Exchange 2003升级至Exchange 2007

环境: 三台机器:DC Exchange2003 Exchange2007 计算机名:DC MAIL NEWMAIL 前提条件: 1.Exchange组织设置为纯模式。 2.Exchange 2003安装SP2 3.拥有Schema Master角色的DC及所有GC运行在Windows 2003 SP1或更高以上 4.AD域提升到最高 不被Exchange 2007支持的组件有: Nov…

蓝桥杯 标题:纵横火柴旗子

【编程题】这是一个纵横火柴棒游戏。如图[1.jpg]&#xff0c;在一个3x4的方格中&#xff0c;游戏的双方轮流放置火柴棒。其规则是&#xff1a;1. 不能放置在已经放置火柴棒的地方&#xff08;即只能在空格中放置&#xff09;。2. 火柴棒的方向只能是垂直或水平放置。3. 火柴棒不…

易语言源代码毁来者来了!!

2009年12月7号16:34分&#xff0c;恐怖现象在次出现了&#xff01; 在编译易程序时&#xff0c;突然提示&#xff0c;某某模块找不到了&#xff0c;我跑到软件目录下一看&#xff0c;妈啊不得了&#xff0c;目录中一百多个文件能删除的全部都被删除了&#xff0c;只剩余几个残破…

矩阵连乘 动态规划 详解

矩阵连乘问题----动态规划(转载)&#xff1a; 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与Ai1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少。…

网上威客的猫腻

近期在威客网上转了转 在国内的几大威客&#xff08;任务中国 taskcn,项目交易网sxsoft&#xff09;等上看了看 发现那竞标人真是多啊 经过一两次尝试&#xff08;想弄点小零花钱嘛&#xff09; 发现其中还真有不少猫腻 这里重灾区就是项目交易网 www.sxsoft.com 该网站是北京一…

php中mysql_connect与mysql_pconnect的区别

前阵子去面试被问到了mysql_connect跟mysql_pconnect的区别, 很不幸本人只答出一条, 似乎还没被认可~回来翻了下php手册记录之.简单的来说mysql_pconnect是用来在php与mysql间建立一条持续连接, 一般php的执行模式是脚本开始执行时初始化所有资源, 脚本运行结束后释放所有资源.…

软件测试-白盒测试(六种覆盖准则)

白盒测试过程中&#xff1a; 六种覆盖方法中&#xff1a;覆盖强度由弱到强的顺序依次是&#xff1a; 语句覆盖判定逻辑覆盖条件逻辑覆盖‘判断逻辑条件覆盖条件组合覆盖路径覆盖 举例&#xff1a; if(a&&b) {cab; } else {ca-b; }12345678 1.语句覆盖&#xff1a;…

Linux 的mv命令

命令格式:mv a b 总结起来有以下几种情况: a是文件名,b不存在 a改名为b。 a是文件名,b是文件名 a改名为b,原b被覆盖。 a是文件名,b是目录名,b下没有名为a的文件或目录 a移动到b目录下。 a是文件名,b是目录名,b下没有…

白盒测试中的六种覆盖方法及案例分析

语句覆盖是指选择足够的测试用例&#xff0c;使得运行这些测试用例时&#xff0c;被测程序的每一个语句至少执行一次&#xff0c;其覆盖标准无法发现判定中逻辑运算的错误&#xff1b;判定覆盖<又叫分支覆盖率>是指选择足够的测试用例&#xff0c;使得运行这些测试用例时…

回文数的C语言表述

2019独角兽企业重金招聘Python工程师标准>>> 现在的程序针对范围是0开始。直到溢出 #include #includemain(){ int i; /*本人的电脑用long和int一样*/for(i0;i<500;i){ if(svalue(i)) printf("%3d,",i); }getch();} int sv…

别人的爬虫在干啥

古人云博采众长&#xff0c;我们来看看其他人的爬虫是怎么学和用的&#xff1a; 爬虫文章 in 简书程序员专题&#xff1a; like:128 - Python 爬取落网音乐 like:127 - 【图文详解】python爬虫实战——5分钟做个图片自动下载器like:97 - 用Python写一个简单的微博爬虫like:87 …

windowsXP/7下消除快捷键箭头的方法

1.修改注册表。&#xff08;1&#xff09;启动注册表编辑器&#xff1a;点击 开始—运行里面输入“regedit”&#xff08;2&#xff09;然后依次展开如下分支&#xff1a;“HKEY_CLASSES_ROOT\lnkfile”&#xff1b;删除“lnkfile”子项中的“IsShortcut”字符串值项注意&#…

LVM( Logical Volume Manager )配置案例(on RHEL4)

LVM( Logical Volume Manager )配置案例(on RHEL4) 一 LVM配置步骤 1.准备一个分区 fdisk /dev/hda (或/dev/sda) 本案例中创建的分区为/dev/hda15 2.创建PV pvcreate /dev/hda15 如果有多少分区/dev/hda15,/dev/hda16&#xff0c;/dev/hda17,则可以 pvcreae /dev/hda1[5-7] 3.…

网络地址和广播地址

1.总述 IP地址使用32位二进数表示&#xff0c;每一个主机或路由器的接口都有全局唯一的IP地址&#xff08;NAT是个例外&#xff09;&#xff0c;它由网络号(NetID)和主机号(HostID)组成&#xff0c;它可以分为五类&#xff0c;如下&#xff1a; 2.地址划分 1&#xff09;A类地…

数据库 连接池、缓冲池(定义、原理)

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接&#xff0c;当需要建立数据库连接时&#xff0c;只需要从缓冲池中取出一个了&#xff0c;使用完毕后再放回去。我们可以通过设定连接池最大数来防止系统无尽的与数据库连接。更为…