亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子piles[i]
。
遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。
亞歷克斯和李輪流進行,亞歷克斯先開始。 每回合,玩家從行的開始或結束處取走整堆石頭。 這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲勝。
假設亞歷克斯和李都發揮出最佳水平,當亞歷克斯贏得比賽時返回true
,當李贏得比賽時返回false
。
示例:
輸入:[5,3,4,5]
輸出:true
解釋:亞歷克斯先開始,只能拿前 5 顆或後 5 顆石子 。
假設他取了前 5 顆,這一行就變成了 [3,4,5] 。
如果李拿走前 3 顆,那麼剩下的是 [4,5],亞歷克斯拿走後 5 顆贏得 10 分。
如果李拿走後 5 顆,那麼剩下的是 [3,4],亞歷克斯拿走後 4 顆贏得 9 分。
這表明,取前 5 顆石子對亞歷克斯來說是乙個勝利的舉動,所以我們返回 true 。
2 <= piles.length <= 500
piles.length
是偶數。
1 <= piles[i] <= 500
sum(piles)
是奇數。
狀態包括:
dp[i][j][k] 表示對於 piles[i…j] 這一堆石頭, k 能拿到的最高分數。
k = 0 表示先手取石子,可以取左邊(得到 piles[i],然後面對 piles[i+1…j] 時作為後手),可以取右邊(得到 piles[j],然後面對 piles[i…j-1] 時作為後手)。
dp[i][j][0] = max(dp[i+1][j][1] + piles[i], dp[i][j-1][1] + piles[j])
若先手取左邊,後手面對 piles[i+1…j] 時作為先手;
dp[i][j][1] = dp[i+1][j][0]
若先手取右邊,後手面對 piles[i…j-1] 時作為先手;
dp[i][j][1] = dp[i][j-1][0]
初始情況:
i == j,即只有一堆石子,先手拿走全部 dp[i][j][0] = piles[i], dp[i][j][1] = 0
推導 dp[i][j][k] 需要知道 dp[i+1][j][k] 和 dp[i][j-1][k], dp矩陣中的相對位置如下,需要斜著遍歷陣列。
d p[
k]i,
j−1d
p[k]
i,jd
p[k]
i+1,
j−1d
p[k]
i+1,
j\begin dp[k]_ & dp[k]_ \\ dp[k]_ & dp[k]_\\ \end
dp[k]i
,j−1
dp[
k]i+
1,j−
1d
p[k]
i,j
dp[k
]i+1
,j
class
solution
:def
stonegame
(self, piles: list[
int])-
>
bool
: piles_size =
len(piles)
# 初始化 dp
dp =[[
[0,0
]if i != j else
[piles[i],0
]for j in
range
(piles_size)
]for i in
range
(piles_size)
]# 斜著遍歷
for t in
range
(piles_size)
:for i in
range
(piles_size-t)
: j = i + t
if i == j:
continue
left = dp[i+1]
[j][1]
+ piles[i]
right = dp[i]
[j-1][
1]+ piles[j]
if left > right:
dp[i]
[j][0]
= left
dp[i]
[j][1]
= dp[i+1]
[j][0]
else
: dp[i]
[j][0]
= right
dp[i]
[j][1]
= dp[i]
[j-1][
0]return
true
if dp[0]
[piles_size-1]
[0]> dp[0]
[piles_size-1]
[1]else
false
2973 石頭遊戲
給出乙個方格陣,初始每個格仔中都沒有石頭,然後每個格仔都有乙個操作序列,並且每時刻執行乙個,迴圈執行,序列長度小於等於6,問t時刻後石頭個數最多的格仔中有幾個石頭。因為操作序列長度小於等於6,所以每60次操作必有一次迴圈,所以可以對60次操作建乙個矩陣,由60次操作相乘,矩陣的長寬均為方格矩陣的元素...
2 石頭遊戲(坑爹)
題目抽象 一堆石子兩個人輪流取,每次至少要取走乙個。先取的人第一次可以取任意多個,但是不能全部取完。之後每個人取石子時,能取的數目最多不能超過對手剛才取的石子數的k倍 k為給定常量 取走最後乙個石子的人算贏。在兩個人都以最優策略進行遊戲時,先手要麼必勝要麼必負,必勝還是必負取決於一開始有多少個石子,...
11 石頭 剪刀 布遊戲
bin bash 編寫指令碼,實現人機 石頭,剪刀,布 遊戲 game 石頭 剪刀 布 num random 3 computer 通過隨機數獲取計算機的出拳 出拳的可能性儲存在乙個陣列中,game 0 game 1 game 2 分別是 3 中不同的可能 echo 請根據下列提示選擇您的出拳手勢 ...