• 关于Fibonacci博弈的一些学习


    关于Fibonacci博弈的一些学习

    一道例题

    问题

    给定n(n2)个石头,游戏双方轮流取至少一个石子,取到最后一个石子的人算赢,但是要满足一下规则:

    1. 第一次取不能全部取完所有的石子。
    2. 设前一次取的石子数为m,这次取的石子的数量不能超过2m

      问先手是否有必胜策略。

    分析

    当时看到这道题(当时看的还是加强版)的时候第一反应是设计DP。

    fi,j为还剩下i 个石头,取的上限为j时是否有必胜策略。然后依题意DP或记忆化搜索转移即可。

    然而这样显然是不能通过本题的,因为数据范围比较大。

    这里引(bai)入(du)一个结论:

    如果n是一个斐波那契数,那么一定是必败态(与上限无关,只要不能直接全部取完)。

    我们来考虑用数学归纳法来证明:

    我们设n=fibi

    n=2时,先手只能取一个,后手一定可以取到最后一个,所以必败。

    n>2时,我们假设ik时,结论都成立。那么只要证i=k+1时结论成立。

    根据Fibonacci数列的定义:fibk+1=fibk+fibk1 ,我们可以把fibk+1堆石子分为fibkfibk1两堆。

    设先手取的石子数为x。为了方便起见,我们称数量为fibi的石子为第i组。

    我们分两种情况来讨论:

    1. x<fibk1

      那么此时我们就可以先递归到k1 的时候去考虑,

      因为我们之前假设过ik 时都成立,

      所以此时后手肯定可以取到k1的最后一个石子。

      然后此时就剩下了fibk 堆石子。

      此时只要证明不论在k1那堆里面怎么取,取到k那堆时的上限都不会超过fibk。(这样子的话情况就可以变为k堆的情况,由于前面我们的假设所以它就是成立的。)

      我们使用反证法来证明。

      我们先假设存在一种情况使得后手取完k1堆里的最后一个石子之后,先手可以一次性取完k堆里的所有石子。

      那么我们设后手在k1里的最后一次取完时的数量为yy要满足的条件是yfibk2

      剩下的那一堆的数量为fibk1y 。要使得y尽可能地大,前一次取的石子也得尽可能地大,所以我们假设剩下的全取。那么就得满足y2(fibk1y) (游戏规则)。

      将上面那个式子拆开:y2fibk12y, 移项:y23fibk1

      联立上面的两个不等式:

      {yfibk2y23fibk1

      所以只要证不存在这样的y,即23fibk1<fibk2

      继续化简:fibk>43fibk1

      fibk 拆掉然后再把fibk1移过去:fibk2>13fibk1

      上面那个式子可能再用个归纳法什么的应该能证吧。。。由于篇(懒)幅(癌)问(发)题(作)我就不具体证明了。。。(其实大家写几项应该也能看的出来吧)

      假装我们证完了上面那个式子以后,那么原命题也就得证了。

    2. xfibk1

      那么后手就可以直接取完。考虑证明:

      我们要证的是:2xfibk

      只要证:2fibk1fibk (进行一些放缩)

      只要证:fibk1fibk2

      Fibonacci
      fibk1fibk2

      以上步步可逆,所以原命题得证。

    综上所述,当nFibonacci数时,先手处于必败态。

    那么对于不是Fibonacci的数呢?我们引入一个定理:

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

    具体地来说,就是对于一个不是Fibonacci数的数x,可以写成

    x=fiba1+fiba2+...+fiban(a2a1>1,a3a2>1,...,anan1>1)

    的形式。

    打个比方,x=28可以写成28=21+5+2的形式。

    所以先手可以先把最小的那一堆全部取掉,

    aiai1>1(i>1)
    fibai>2fibai1

    所以对于每一堆来说都是完全独立的游戏,并且对于后手来说都是必败态。所以先手必胜。

    所以,当nFibonacci数时,先手必败,否则先手必胜。

  • 相关阅读:
    win10安装node后npm 报错
    nodejs 图片的像素级别处理
    vue 等比例截图组件,支持缩放和旋转
    撸一个 vue 的截图组件,按比例截取
    原生 js 录屏功能
    Mongodb命令行导入导出数据
    Linux 下配置 iSCSI 客户端
    基于 Docker 实现 DevOps 的一些探索
    10 张图带你深入理解 Docker 容器和镜像
    浅谈 Docker 安全合规建设
  • 原文地址:https://www.cnblogs.com/cocottt/p/6764970.html
Copyright © 2020-2023  润新知