描述:

有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

1)先手不能在第一次把所有的石子取完,至少取1颗;

2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍;

3)取走最后一个石子的人为赢家。

结论:

如果n为斐波那契数(2,3,5,8,13,21,34,55,89...),则先手必败。

证明一:

如果按原来的套路:

由于局面不仅跟当前剩余数有关,还与上次取的数有关,所以状态中需要考虑能取的数(变得没那么直观)。

必败态:当剩余数为斐波那契数,且不能一次取完时;

    当剩余数不是斐波那契数,但其按Zeckendorf定理分解后,不能一次取完其中最小分解数时。

必胜态:当剩余数不是斐波那契数,且其按Zeckendorf定理分解后,能一次取完其中最小分解数时;

    当能一次取完时剩余数时;

只需证明:

1.必败态任一操作都将转为必胜态;

2.必胜态存在一操作转为必败态;

行但是麻烦,仅与当前局面有关的游戏,用这种分析才方便。

证明二:

当开始是斐波那契数时,用数学归纳法证明必败:

当n=2时,必败;

设当n<=f(k)时,必败;

则当n=f(k + 1)时,有f(k + 1) = f(k) + f(k - 1):

  如果取走数量大于等于f(k -1),则后手可以一次取完,由于f(k) < 2(k - 1)。

  则先手不能一次取完f(k - 1)。根据归纳法的假设,对于f(k - 1),后手必能取得f(k - 1)最后一颗。

此时,还需要证明,先手不能一次取完剩下的f(k):

  易得,先手取的石子数x = f(k - 1) / 3时,后手则取2 * f(k - 1) / 3,为最大。

  (由于后手取石子的最大值函数为max(2x, f(k - 1) - x),两者相等时最大,即x = f(k - 1) / 3)

  此时,先手能取得最大值为2 * (2 * f(k - 1) / 3),即4f(k - 1) / 3,与f(k)相比,做差可知后者大,即一次不能取完,由于假设先手必败。

证毕。

当开始不是斐波那契数列时:

由“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。

则数n可以分解为n1 + n2 + ... + nx,(1...x是下标)每个都是斐波那契数,且没有两个是连续的;

此时,只要取走最小的那个即可。由于n(x - 1)和nx不连续,则易得n(x - 1) > 2nx,即取走最小那个数后,后手不能取完第二小的数。

此时,问题分解为多个小的斐波那契数,且必败态都是对方。

ICG游戏:斐波那契博弈的更多相关文章

  1. {HDU}{2516}{取石子游戏}{斐波那契博弈}

    题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...

  2. HDU 2516 取石子游戏 斐波纳契博弈

    斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...

  3. HDU 2516 取石子游戏(斐波那契博弈)

    取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  4. 51Nod 1070:Bash游戏 V4(斐波那契博弈)

    1070 Bash游戏 V4  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个 ...

  5. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  6. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  7. 题解报告:hdu 2516 取石子游戏(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...

  8. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  9. hdu 2516 取石子游戏 (斐波那契博弈)

    题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜,先取者负输出"Second win",先取者胜 ...

  10. 取石子游戏 HDU2516(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...

随机推荐

  1. MyEclipse web jsp 如何调试

    MyEclipse如何调试 | 浏览:882 | 更新:2014-03-13 17:38 1 2 3 4 5 分步阅读 当程序写好之后,如何调试呢? 我们在MyEclipse中jav添加断点,运行de ...

  2. SM2的非对称加解密java工具类

    maven依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov- ...

  3. 《DSP using MATLAB》Problem 2.4

    生成并用stem函数画出这几个序列. 1.代码: %% ------------------------------------------------------------------------ ...

  4. 《DSP using MATLAB》示例 Example 9.10

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  5. jquery插件与扩展一

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  6. Linux下驱动模块学习

    1.modutils中提供了相关的insmod,rmmod,modinfo工具2.modprobe在识别出目标模块所依赖模块后也是调用insmod.3.从外部看模块只是普通可重定位的目标文件.可重定位 ...

  7. streamsets origin 说明

    origin 是streamsets pipeline的soure 入口,只能应用一个origin 在pipeline中, 对于运行在不同执行模式的pipeline 可以应用不同的origin 独立模 ...

  8. CSS为英文和中文字体分别设置不同的字体

    font-family的调用方法: div { font-family:Arial,'Times New Roman','Microsoft YaHei',SimHei; font:bold 12px ...

  9. C#在64位操作系统上连接Oracle的问题和解决方案

    C#使用System.Data.OracleClient连接Oracle数据库.之前在WinXP上正常运行的程序移植到Windows 2008 x64上之后就连不上数据库了.错误信息如下: 尝试加载O ...

  10. bzoj 2007 [Noi2010]海拔——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...