LintCode python 小白-硬币-博弈论,动态规划

题目:有 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值