ICG游戏:斐波那契博弈
描述:
有一堆个数为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游戏:斐波那契博弈的更多相关文章
- {HDU}{2516}{取石子游戏}{斐波那契博弈}
题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...
- HDU 2516 取石子游戏 斐波纳契博弈
斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...
- HDU 2516 取石子游戏(斐波那契博弈)
取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- 51Nod 1070:Bash游戏 V4(斐波那契博弈)
1070 Bash游戏 V4 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个 ...
- HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...
- 题解报告:hdu 2516 取石子游戏(斐波那契博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...
- 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))
Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...
- hdu 2516 取石子游戏 (斐波那契博弈)
题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜,先取者负输出"Second win",先取者胜 ...
- 取石子游戏 HDU2516(斐波那契博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...
随机推荐
- websocket 缺点
当时用 python 做的服务器,后来回去想再工作项目上用,但新的技术升级,随之而来还是要解决很多非技术问题, 服务器带宽,并发服务器性能方方面面考虑之后还是没有用上,十分可惜, 一个新的技术推动,尤 ...
- C++可调用对象与函数表
c++的可调用对象 有 函数 函数指针 lambda表达式 bind的对象 重载了函数调用运算符的类 如何调用? 函数调用 void afuncToCall() { cout << &qu ...
- opencv之访问图像像素
访问像素的三种方法 ①指针访问:最快 ②迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 ③动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- 20165212实验三——敏捷开发与XP实践
20165212实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过 ...
- lua 二进制函数使用
由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个"bit"表中,使用时 ...
- HTML表单 在提交之前 验证表单数字合法性
function checkform(){ if(!isNumeric($('.apply_money').val())){ alert("必须是数字"); return fals ...
- Linux进程间通信——使用信号量(转)
这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...
- cas sso ajax的jsonp实现方案总结(新浪微薄、淘宝案例分析)
Cas自定义登录页面Ajax实现:http://cydiay.iteye.com/blog/1738713 CAS 之 跨域 Ajax 登录实践:http://denger.iteye.com/blo ...
- C BIN加密
#include <stdio.h> #include <string.h> #include <stdlib.h> #ifndef DWORD #define D ...