一道博弈的面试题及其算法正确性证明
来源:互联网 发布:上海进出口数据 编辑:程序博客网 时间:2024/05/16 20:30
题目是这样子的:一堆石子有N个,两个人轮流取石头,限制条件如下:
- 每个人一次只能取1~3个石头。
- 假设两人足够聪明(如果可以胜利,不会放水或者愚蠢的取石头)
胜负条件是最后取完石头的人算输(甲取完,石头正好没了,甲输),那么对于先取石头的人来说,怎么样的石头数量才能保证其一定赢得游戏,或者输掉游戏。
这道题目算是一个简单的博弈问题,分析问题的基础情况,记先取的人必赢为MW(Must Win),先取的人必输为ML(Must Lose):
- N=1:ML。
- N=2:MW(先取者只需取一个,即可获胜)。
- N=3 : MW (先取者只需取两个,即可获胜)。
- N=4:MW(先取者只需取三个,即可获胜)。
- N=5:ML(无论先取几个,实际上留下的石头数量都会使后取者到达必赢得位置上)。
- N=6:MW(先取者先取一个,使后取者被推到必输的位置上)
- ……
从上面的推理我们可以看出,博弈获胜的关键在于,N的数量决定了先取者是否能获胜,可以列出ML的时候,N=1,5,9,13.。。,即N满足N%4=1的时候,先取者必输,因为在这些点上,先取者无论用怎样的策略都会使对方进到必赢得位置上,那么如何来证明这个猜想的正确性呢?
在面试的时候,我们自然的先由以上简单的尝试来寻找规律,当总结出规律进行验证时,采用数学归纳法进行验证:
- 当N=1的时候,很明显ML。
- 假设当N%4=1的时候,ML成立。
当(N+4)%4=1的时候,有以下三种情况:先取一个,剩下N+3个石头不满足式子,后取者进入必赢模式;先取两个和先取三个同理可得。则所推公式正确性得证。
那么如果取1~K个石头,同样也可以得到关键公式为N%(k+1)=1;
考虑这类博弈问题的一个关键点就在于:1. 对于所有的MW模式,一定存在一个MW模式到ML模式的转换。
2. 对于所有的ML模式,对于所有的转换都是ML模式到MW模式。
把握好这两个特性,便可在面试遇到这类问题时比较思路清晰的分析问题了。
0 0
- 一道博弈的面试题及其算法正确性证明
- 迪杰斯特拉(Dijkstra)算法描述及其正确性证明
- krusal算法正确性的证明
- 全排列算法的正确性证明
- 哈夫曼树构造算法的正确性证明
- 在数组中寻找主要元素的算法及其正确性证明。
- 算法正确性证明三要素
- 贪心算法正确性证明
- 一道面试题及其扩展
- 一道算法面试题的分析
- 网易有道的一道算法面试题
- 对一道算法面试题的理解
- 一道别致的算法面试题
- 【算法】一道有趣的GOOGLE面试题
- 一道折半算法变种的面试题
- 补码正确性的证明
- 算法学习二:循环不变式证明算法的正确性
- Dijkstra 算法 -方法、算法、代码和正确性的证明
- [leetcode] 139 Word Break
- UNIX STDOUT_FILENO验证
- 自定义JTabbedPane的标签栏
- 初识Docker
- Web项目使用Spring框架服务器启动加载xml文件的过程学习
- 一道博弈的面试题及其算法正确性证明
- 黑马程序员---Java面向对象(单例设计模式)
- linux系统启动详解
- hdu 5442 2015长春网络赛
- progressDemo
- EclipseProblems:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- linux命令之ip
- hdu 5438 Ponds 拓扑排序+并查集 2015 ACM/ICPC Asia Regional Changchun Online
- 科技文图片的生成之PSTricks