关于Fibonacci博弈的一些学习
关于Fibonacci博弈的一些学习
一道例题
问题
给定n(n≥2)个石头,游戏双方轮流取至少一个石子,取到最后一个石子的人算赢,但是要满足一下规则:
- 第一次取不能全部取完所有的石子。
设前一次取的石子数为m,这次取的石子的数量不能超过2m。
问先手是否有必胜策略。
分析
当时看到这道题(当时看的还是加强版)的时候第一反应是设计DP。
计fi,j为还剩下i 个石头,取的上限为j时是否有必胜策略。然后依题意DP或记忆化搜索转移即可。
然而这样显然是不能通过本题的,因为数据范围比较大。
这里引(bai)入(du)一个结论:
如果n是一个斐波那契数,那么一定是必败态(与上限无关,只要不能直接全部取完)。
我们来考虑用数学归纳法来证明:
我们设n=fibi。
当n=2时,先手只能取一个,后手一定可以取到最后一个,所以必败。
当n>2时,我们假设i≤k时,结论都成立。那么只要证i=k+1时结论成立。
根据Fibonacci数列的定义:fibk+1=fibk+fibk−1 ,我们可以把fibk+1堆石子分为fibk和fibk−1两堆。
设先手取的石子数为x。为了方便起见,我们称数量为fibi的石子为第i组。
我们分两种情况来讨论:
若x<fibk−1
那么此时我们就可以先递归到k−1 的时候去考虑,
因为我们之前假设过i≤k 时都成立,
所以此时后手肯定可以取到k−1的最后一个石子。
然后此时就剩下了fibk 堆石子。
此时只要证明不论在k−1那堆里面怎么取,取到k那堆时的上限都不会超过fibk。(这样子的话情况就可以变为k堆的情况,由于前面我们的假设所以它就是成立的。)
我们使用反证法来证明。
我们先假设存在一种情况使得后手取完k−1堆里的最后一个石子之后,先手可以一次性取完k堆里的所有石子。
那么我们设后手在k−1里的最后一次取完时的数量为y。y要满足的条件是y≥fibk2 。
剩下的那一堆的数量为fibk−1−y 。要使得y尽可能地大,前一次取的石子也得尽可能地大,所以我们假设剩下的全取。那么就得满足y≤2(fibk−1−y) (游戏规则)。
将上面那个式子拆开:y≤2fibk−1−2y, 移项:y≤23fibk−1 。
联立上面的两个不等式:
{y≥fibk2y≤23fibk−1所以只要证不存在这样的y,即23fibk−1<fibk2 。
继续化简:fibk>43fibk−1
把fibk 拆掉然后再把fibk−1移过去:fibk−2>13fibk−1
上面那个式子可能再用个归纳法什么的应该能证吧。。。由于篇(懒)幅(癌)问(发)题(作)我就不具体证明了。。。(其实大家写几项应该也能看的出来吧)
假装我们证完了上面那个式子以后,那么原命题也就得证了。若x≥fibk−1
那么后手就可以直接取完。考虑证明:
我们要证的是:2x≥fibk。
只要证:2fibk−1≥fibk (进行一些放缩)
只要证:fibk−1≥fibk−2
∵Fibonacci数列是一个递增的数列∴fibk−1≥fibk−2以上步步可逆,所以原命题得证。
综上所述,当n为Fibonacci数时,先手处于必败态。
那么对于不是Fibonacci的数呢?我们引入一个定理:
“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。
具体地来说,就是对于一个不是Fibonacci数的数x,可以写成
的形式。
打个比方,x=28可以写成28=21+5+2的形式。
所以先手可以先把最小的那一堆全部取掉,
所以对于每一堆来说都是完全独立的游戏,并且对于后手来说都是必败态。所以先手必胜。
所以,当n为Fibonacci数时,先手必败,否则先手必胜。
关于Fibonacci博弈的一些学习的更多相关文章
- hdu 2516(Fibonacci博弈博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个, ...
- POJ3070 Fibonacci[矩阵乘法]【学习笔记】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- hdu 2516 取石子游戏 (Fibonacci博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- Tensorflow实战Google深度学习框架-总结-1
第一章:深度学习简介 1⃣️应用有 1.计算机视觉 2.语音识别 3.自然语言处理 4.人机博弈 2⃣️深度学习,机器学习,AI 的关系
- AI面试必备/深度学习100问1-50题答案解析
AI面试必备/深度学习100问1-50题答案解析 2018年09月04日 15:42:07 刀客123 阅读数 2020更多 分类专栏: 机器学习 转载:https://blog.csdn.net ...
- ACM训练计划建议(写给本校acmer,欢迎围观和指正)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- ACM训练计划建议(转)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- 从马文到AlphaGo AI走过了怎样的70年?
(原标题:从马文·明斯基到AlphaGo,人工智能走过了怎样的70年?) [编者按]从19世纪中叶人工智能的萌芽时期,到现今人工智能的重生,从马文·明斯基到AlphaGo,历史上发生了哪些激动人心的故 ...
随机推荐
- mybatis字段映射枚举类型
在底层使用mybatis的时候,我们可能会需要把表里的字段映射到Java里面的枚举类,现总结下工作中的用法: sku表里一个status_type字段为int类型.(这里是postgresql的脚本) ...
- 【7.9校内test】T2 极值问题
这个题真的,毫无思路的说,但是我们会打表啊: lz的打表之路: 当然是手写一个暴力啦(*^▽^*)! 然后滚去配置lemon测试一下暴力可以得多少分qwq: 是的40分呢! 然后其实看上面也能看出来一 ...
- Python进阶编程 类的成员
类的成员 class A: company_name='老男孩' #静态变量 __iphone='1515151' #私有静态变量 def __init__(self,name,age): #特殊方法 ...
- SparkML之推荐算法ALS
参考: SparkML之推荐算法(一)ALS --有个比较详细的讲解,包含blocks使用. Spark ALS源码总结 //TODO 源码,集群尝试.研究blocks使用原理及作用. 官方解释:nu ...
- php多域名单站点路由
能够使多域名但是只有一个站点的小站,通过路由访问到各个指定目录 <?php //域名跳转路由 //默认跳转 $default = "http://www.stanwind.com/in ...
- .net几种timer区别
概述:.net框架不同名称控件都包含了各种timer,但每个timer有什么具体区别呢? 一.System.Threading private static void ThreadingTimer() ...
- OCR(光学字符识别)技术简介
OCR技术起源 OCR最早的概念是由德国人Tausheck最先提出的,1966年他们发表了第一篇关于汉字识别的文章,采用了模板匹配法识别了1000个印刷体汉字.早在60.70年代,世界各国就开始有OC ...
- 如何在Ubuntu上在多个PHP版本之间切换 (for swoole)
摘要: 之前一直用Php7.0,今天想用7.2试下一些特性,安装完之后,切换回7.0却不能再使用7.0的swoole了,原来是切换方式出现了问题 一 从PHP 7.0 切换到 PHP 7.2 Apac ...
- linux下mysql的常用命令
更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -uroot Welcome to th ...
- ajax传输数组类型的参数
$.ajax({ type:"post", traditional: true, data:{arr:arr}, url:"${pageContext.request.c ...