LintCode python 小白-硬幣-博弈論,動態規劃

來源:互聯網
上載者:User

題目:有 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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.