LintCode python 小白-硬币-博弈论,动态规划
来源:互联网 发布:云南风暴网络 编辑:程序博客网 时间:2024/05/21 08:40
题目:有 n 个不同价值的硬币排成一条线。两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 第一个玩家 是输还是赢?
样例
给定数组 A = [1,2,2], 返回 true.
给定数组 A = [1,2,4], 返回 false.
这道题一开始题目都没读懂,尴尬
题目解析:两个参赛者依次在左边可以选择拿走1个或2个硬币,为了赢,两个人都很聪明,尽量选择让自己赢得方式。比如A=[1,2,4,6]第一个人第一次选择1个,第二个人没办法只能选择2个(即使一个也输),然后第一个人选择一个,总价值为1+6=7,而第二个人只有2+4=6,不管怎样,第一个人都会赢
比如:A=[1,2,4,4],第一个人第一次选择1个还是两个,都会输,因为当第一个人选择一个时,第二个人选择两个得到2+4=6,第一个人只有1+4=5;如果第一个人一开始选择两个1+2=3,则第二个第一次也是选择两个,及4+4=6,不管怎样,第一个人都会输。
最重要思路:选手都选择对自己最优
该为博弈论,算法可用动态规划
详细可以看下面的博客:
http://www.mamicode.com/info-detail-1114851.html
代码如下:
def firstWillWin(self, values): # write your code here s=values n=len(s) if n<=2: return 1 sum1=sum(s) result=[] if n==3: if s[0]+s[1]>s[2]: return 1 else: return 0 for j in range(n+1): result+=[0] result[n-1]=s[n-1] result[n-2]=s[n-2]+s[n-1] result[n-3]=s[n-3]+s[n-2] m=n-4 for i in range(m,-1,-1): a=s[i]+min(result[i+2],result[i+3]) b=s[i]+s[i+1]+min(result[i+3],result[i+4]) result[i]=max(a,b) if result[0]>=(sum1-result[0]): return 1 else: return 0
阅读全文
1 0
- LintCode python 小白-硬币-博弈论,动态规划
- 【动态规划】凑硬币
- 动态规划之硬币
- 动态规划----硬币问题
- 动态规划-最少硬币
- 动态规划-硬币问题
- 动态规划-硬币问题
- 动态规划:分硬币
- 动态规划-硬币问题
- 动态规划 硬币 POJ
- 动态规划凑硬币
- 动态规划 凑硬币
- LintCode python 小白1
- 硬币找零(动态规划)
- 动态规划 - 硬币问题
- 最少硬币问题 动态规划
- 硬币选择问题-动态规划
- 动态规划--凑硬币问题
- 初识线程
- win7 无法给系统保留的100M空间分配盘符时,用下面的方法就好
- HTML基础课程及标签笔记 (第三章)
- Redis-事务控制
- Object类型分析!
- LintCode python 小白-硬币-博弈论,动态规划
- Centos6.5下安装jdk1.8
- shu418 丢史蒂芬妮
- 关于json的小例子
- 基于ARM--s3c2451的函数封装---UART封装
- JDK配置环境变量和用法
- Lua I/O库(二)
- jQuery 第一个例子
- 百度2017秋招笔试编程题