題目:有 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