有 n 個不同價值的硬幣排成一條線。兩個參賽者輪流從 左邊 依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。計算兩個人分別拿到的硬幣總價值,價值高的人獲勝。
請判定 先手玩家 必勝還是必敗?
若必勝, 返回 true, 否則返回 false.
樣例 1:
輸入: [1, 2, 2]
輸出: true
解釋: 先手玩家直接拿走兩顆硬幣即可.
樣例 2:
輸入: [1, 2, 4]
輸出: false
解釋: 無論先手拿乙個還是兩個, 後手可以拿完, 然後總價值更高.
設dpi表示從i到n-1處,先手比後手多拿的分數。那麼要求的就是dp0的正負。
因為只可以拿1個或者2個,所以最後的2個dpn-1 = values[n-1], dpn-2 = values[n-1]+values[n-2].
對於任意的dpi,也是只有2個取法:
拿1個values[i]時,先手獲得了values[i],但是對於剩下的,他失去了先手,對面的先手獲得了dpi+1,所以他比對面多values[i]-dpi+1
拿2個,values[i]和values[i+1]時,先手獲得了values[i]+values[i+1],對面的先手可以獲得dpi+2,所以此時先手比對面多values[i]+values[i+2]-dpi+2
最終可以從n-3計算到0,得到正負。
1234567
891011
1213
1415
1617
1819
20
class solutionreturn dp[0] > 0;}};
-------------end of file
thanks for reading-------------
lintcode 硬幣排成線
有 n 個硬幣排成一條線。兩個參賽者輪流從右邊依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。拿到最後一枚硬幣的人獲勝。請判定 先手玩家 必勝還是必敗?若必勝,返回 true,否則返回 false.輸入 4 輸出 true 解釋 先手玩家第一輪拿走乙個硬幣,此時還剩三個.這時無論後手玩家拿乙個還是兩...
lintcode 394 硬幣排成線
有 n 個硬幣排成一條線。兩個參賽者輪流從右邊依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。拿到最後一枚硬幣的人獲勝。請判定 第乙個玩家 是輸還是贏?樣例n 1,返回 true.n 2,返回 true.n 3,返回 false.n 4,返回 true.n 5,返回 true.挑戰o 1 時間複雜度...
硬幣排成線
題目 有 n 個硬幣排成一條線。兩個參賽者輪流從右邊依次拿走 1 或 2 個硬幣,直到沒有硬幣為止。拿到最後一枚硬幣的人獲勝。請判定 先手玩家 必勝還是必敗?若必勝,返回 true,否則返回 false.樣例樣例 1 輸入 1 輸出 true 樣例 2 輸入 4 輸出 true 解釋 先手玩家第一輪...