877 石頭遊戲

2021-10-06 05:33:23 字數 2685 閱讀 4908

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子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 <= 500piles.length是偶數。

1 <= piles[i] <= 500sum(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−

1​​d

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 請根據下列提示選擇您的出拳手勢 ...