IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 斐波那契博弈 -> 正文阅读

[数据结构与算法]斐波那契博弈

可能更好的阅读体验

1. 问题

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

  • 先手不能在第一次把所有的石子取完,至少取 1 1 1 颗;
  • 在此之后每次可以取的石子数至少为 1 1 1,至多为对手 刚取的 石子数的 2 2 2 倍。

约定取走最后一个石子的人为胜利,求先手何时必胜、必败。

2. 结论与证明

**结论:**当 n n n Fibonacci \text{Fibonacci} Fibonacci 数的时候先手必败,否则先手必胜。

首先证明当 n n n Fibonacci \text{Fibonacci} Fibonacci 数的时候先手必败,不妨考虑数学归纳法:

对于 n = 2 n=2 n=2 的情况,显然此时先手必败。

接着不妨设 n = f k ? 1 n=f_{k-1} n=fk?1? 之时结论成立,现在我们证明 n = f k n=f_k n=fk? 的情况。此时可以将石子分成 f k ? 2 , f k ? 1 f_{k-2},f_{k-1} fk?2?,fk?1? 两堆,为啥捏?考虑 2 f k ? 2 > f k 2f_{k-2}>f_k 2fk?2?>fk?,所以一旦先手取石子数 ≥ f k ? 2 \ge f_{k-2} fk?2?,后手就一定能一次取完所有石子。这个结论很重要,也是下文证明的根基。

  • 若先手取 > 1 3 f k ? 2 > \frac{1}{3} f_{k-2} >31?fk?2? 个石子。此时后手可以取完 f k ? 2 f_{k-2} fk?2? 这个石子堆,并且由于后手取的石子数 < 2 3 f k ? 2 <\frac{2}{3}f_{k-2} <32?fk?2?,下一轮先手取的石子数也只能 < 4 3 f k ? 2 = f k ? 2 + 1 3 f k ? 2 <\frac{4}{3}f_{k-2}=f_{k-2}+\frac{1}{3}f_{k-2} <34?fk?2?=fk?2?+31?fk?2?,而 f k ? 1 = f k ? 2 + f k ? 3 f_{k-1}=f_{k-2}+f_{k-3} fk?1?=fk?2?+fk?3?,且 1 3 f k ? 2 < f k ? 4 < f k ? 3 \frac{1}{3}f_{k-2}<f_{k-4}<f_{k-3} 31?fk?2?<fk?4?<fk?3?,所以先手取不完 f k ? 1 f_{k-1} fk?1? 这堆石子。由于 n = f k ? 1 n=f_{k-1} n=fk?1? 时结论成立,而且此时先手的选择空间进一步缩小,所以归纳可得 n = f k n=f_k n=fk? 时先手必败。

  • 若先手取 ≤ 1 3 f k ? 2 \le \frac{1}{3} f_{k-2} 31?fk?2? 个石子。此时可以将 f k ? 2 f_{k-2} fk?2? 这个石子堆分成 f k ? 4 , , f k ? 3 f_{k-4,},f_{k-3} fk?4,?,fk?3? 两堆,这是考虑到 1 3 f k ? 2 < f k ? 4 \frac{1}{3} f_{k-2}<f_{k-4} 31?fk?2?<fk?4?. 然后我们应用上文的结论,同样也可以归纳得到 n = f k n=f_k n=fk? 时先手必败。需要注意的是,上文我们并没有证明后手取完 f k ? 3 f_{k-3} fk?3? 这一堆时的取石子数的范围,但是,由于 f k ? 3 f_{k-3} fk?3? 的下一堆是 f k ? 1 f_{k-1} fk?1?中间一定间隔了编号,所以 2 f k ? 3 < f k ? 1 2f_{k-3}<f_{k-1} 2fk?3?<fk?1?,此时先手仍然无法取完 f k ? 1 f_{k-1} fk?1?. 这也是下文证明先手必胜情况的依据。

现在证明当 n n n 不为 Fibonacci \text{Fibonacci} Fibonacci 数的时候先手必胜,需要用到 Zeckendorf?Theorem \text{Zeckendorf Theorem} Zeckendorf?Theorem:任意自然数均可以被分解为若干个 不连续的 Fibonacci \text{Fibonacci} Fibonacci 数之和。

我们先将 n n n 分解为若干个不连续的 Fibonacci \text{Fibonacci} Fibonacci 数之和,然后取走最小 Fibonacci \text{Fibonacci} Fibonacci 数的石子数。由于不连续,此时后手无法取完任何一个 Fibonacci \text{Fibonacci} Fibonacci 数,这就又回到了 " n n n Fibonacci \text{Fibonacci} Fibonacci 数的时候先手必败" 的情况。所以此时先手必胜。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 11:02:06  更:2022-02-27 11:03:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:30:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码