前往
大廳
主題

LeetCode - 1872. Stone Game VIII 解題心得

Not In My Back Yard | 2021-07-20 00:00:03 | 巴幣 0 | 人氣 210

題目連結:


題目意譯:
Alice 和 Bob 正玩著一個遊戲,其由 Alice 擔任先手。

現在有 n 顆石頭排列成一列。每個玩家的回合中,當石頭數多於 1 時,他們將會做以下操作:
選擇一整數 x > 1,然後移除掉列中最左側的 x 顆石頭。
將移除掉的石頭之數值總和加到該玩家的分數值中。
放置一顆新的石頭於列的左側,其值等於該總和。

遊戲停止於只剩一顆石頭於列中。

Alice 和 Bob 之間的分數差為 (Alice 的分數值 - Bob 的分數值) 。 Alice 的目標是最大化分數差,而 Bob 的目標則是最小化分數差。

給定一個長度為 n 的整數陣列 stones ,其中 stones[i] 代表著從左側數第 i 顆石頭的數值。如果兩人採取最佳策略去玩,回傳 Alice 和 Bob 之間的分數差。

限制:
n == stones.length
2 ≦ n ≦ 10 ^ 5
-10 ^ 4 ≦ stones[i] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: stones = [-1,2,-3,4,-5]
輸出: 5
解釋:
- Alice 將前 4 顆石頭移除,將 (-1) + 2 + (-3) + 4 = 2 加到她的分數值上,並放一個值為 2 的石頭於列的左側。 stones = [2,-5] 。
- Bob 將前 2 顆石頭移除,將 2 + (-5) = -3 加到他的分數值上,並放一個值為 -3 的石頭於列的左側。 stones = [-3] 。
他們之間的分數差為 0 - (-3) = 5 。

範例 2:
輸入: stones = [7,-6,5,10,5,-2,-6]
輸出: 13
解釋:
- Alice 將所有石頭移除,將 7 + (-6) + 5 + 10 + 5 + (-2) + (-6) = 13 加到她的分數值上,並放一個值為 13 的石頭於列的左側。 stones = [13] 。
他們之間的分數差為 13 - 0 = 13 。

範例 3:
輸入: stones = [-10,-12]
輸出: -22
解釋:
- Alice 只能走一步,其為將兩顆石頭皆移除掉。她將 (-10) + (-12) = -22 加到她的分數值上並放一個值為 -22 的石頭於列的左側。 stones = [-22]。
他們之間的分數差為 (-22) - 0 = -22 。


解題思維:
假設 P[i] 為 stones[0] + …… + stones[i](即前綴和(Prefix Sums))、 D[i] 為 Alice 選在位置 i 並將位置 0 ~ 位置 i 的石頭拿走會獲得的終局分數,則我們可以看到:
如果 i 等於 n - 1 , D[n - 1] = P[n - 1] ;
反之,D[i] = P[i] - max(D[j],其中 i < j < n)。
下面那個式子是因為 Bob 要試圖降低分數差之值,也就是 Bob 要盡可能地獲得較大的分數。而 Bob 要獲得盡可能大的分數就可以仿造 Alice 在 D[i + 1] 、 D[i + 2] 、 …… 之行為,看何者較大就選誰。

因此,倘若我們維護一個變數 M,一開始令 M = D[n - 1]。

此時,我們便可以將第二條遞迴式改寫成
D[i] = P[i] - M
如果 D[i] > M 則將 M 更新為 D[i](對應到 max(D[j],其中 i < j < n))。

因此到最後, M 的值即代表著 max(D[i],其中 i < n) 而此即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作