前往
大廳
主題

LeetCode - 1140. Stone Game II 解題心得

Not In My Back Yard | 2024-03-22 12:00:01 | 巴幣 0 | 人氣 35

題目連結:


題目意譯:
Alice 和 Bob 正繼續著他們一如往常的石頭堆遊戲。現在有一些石頭堆排成一列,而每一堆有著正整數數量的石頭 piles[i]。這個遊戲的目標是要得到最多的石頭。

Alice 和 Bob 輪流拿,而 Alice 是先手。一開始,M = 1。

在每一位玩家的回合中,該玩家可以拿走剩餘石頭堆中前 X 堆的所有石頭,其中 1 ≦ X ≦ 2M。接著,M 值將會被設定為 max(M, X)。

遊戲將持續到所有石頭被拿完為止。

假設 Alice 和 Bob 是按最佳策略來玩,回傳 Alice 可以得到的最大石頭數。

限制:
1 ≦ piles.length ≦ 100
1 ≦ piles[i] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: piles = [2,7,9,4,4]
輸出: 10
解釋: 如果 Alice 一開始拿走一堆,Bob 將拿走兩堆,最後 Alice 再拿走 2 堆。Alice 可以得到總計 2 + 4 + 4 = 10 顆石頭。如果 Alice 一開始拿走兩堆,則 Bob 把剩下三堆全部拿走。此時,Alice 將得到總計 2 + 7 = 9 石頭。所以我們將回傳 10,因為其為最大值。

範例 2:
輸入: piles = [1,2,3,4,5,100]
輸出: 104


解題思維:
一如既往的,如果你不知道要做哪些子問題,那就全做吧!(如這題

定義一個三維陣列 D,其中 D[i][j][k] 代表著玩家 i(0 是 Alice、1 是 Bob)在 M 值為 k 且從第 j 堆開始拿(即剩餘石頭堆從第 j 堆開始)的情況下,Alice 從現在開始可以拿多少石頭(是的,不論現在玩家是誰,求的都是 Alice 的石頭數)。

可以看到其遞迴式為:
    當 j == piles.length 時,D[i][j][k] = 0;
    (上式為遞迴的停止條件,因為根本就沒有石頭可以挑了)
    如果 i == 0,D[0][j][k] = max(S(j, P - 1) + D[1][P][max(k, P - j)]);
    如果 i == 1,D[1][j][k] = min(D[0][P][max(k, P - j)])。
    (因為 Alice 要最大化自身的石頭數,而 Bob 的目標是最小化 Alice 的石頭數)
其中 j < P ≦ min(j + k, piles.length),而 S(x, y) 代表著 piles[x] + piles[x + 1] + …… + piles[y] 之值(x < y)。

因此從 D[0][0][1] 開始遞迴求解即可(記得重複做過的子問題不要浪費時間再做,直接沿用即可),即可得到所求。




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

創作回應

更多創作