All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g1801_1900.s1872_stone_game_viii.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g1801_1900.s1872_stone_game_viii;

// #Hard #Array #Dynamic_Programming #Math #Prefix_Sum #Game_Theory
// #2022_05_11_Time_3_ms_(98.18%)_Space_50.9_MB_(98.18%)

/**
 * 1872 - Stone Game VIII\.
 *
 * Hard
 *
 * Alice and Bob take turns playing a game, with **Alice starting first**.
 *
 * There are `n` stones arranged in a row. On each player's turn, while the number of stones is **more than one** , they will do the following:
 *
 * 1.  Choose an integer `x > 1`, and **remove** the leftmost `x` stones from the row.
 * 2.  Add the **sum** of the **removed** stones' values to the player's score.
 * 3.  Place a **new stone** , whose value is equal to that sum, on the left side of the row.
 *
 * The game stops when **only** **one** stone is left in the row.
 *
 * The **score difference** between Alice and Bob is `(Alice's score - Bob's score)`. Alice's goal is to **maximize** the score difference, and Bob's goal is the **minimize** the score difference.
 *
 * Given an integer array `stones` of length `n` where `stones[i]` represents the value of the ith stone **from the left** , return _the **score difference** between Alice and Bob if they both play **optimally**._
 *
 * **Example 1:**
 *
 * **Input:** stones = [-1,2,-3,4,-5]
 *
 * **Output:** 5
 *
 * **Explanation:**
 *
 * - Alice removes the first 4 stones, adds (-1) + 2 + (-3) + 4 = 2 to her score, and places a stone of value 2 on the left. stones = [2,-5].
 *
 * - Bob removes the first 2 stones, adds 2 + (-5) = -3 to his score, and places a stone of value -3 on the left. stones = [-3].
 *
 * The difference between their scores is 2 - (-3) = 5. 
 *
 * **Example 2:**
 *
 * **Input:** stones = [7,-6,5,10,5,-2,-6]
 *
 * **Output:** 13
 *
 * **Explanation:**
 *
 * - Alice removes all stones, adds 7 + (-6) + 5 + 10 + 5 + (-2) + (-6) = 13 to her score, and places a stone of value 13 on the left. stones = [13].
 *
 * The difference between their scores is 13 - 0 = 13. 
 *
 * **Example 3:**
 *
 * **Input:** stones = [-10,-12]
 *
 * **Output:** -22
 *
 * **Explanation:** - Alice can only make one move, which is to remove both stones. She adds (-10) + (-12) = -22 to her score and places a stone of value -22 on the left. stones = [-22].
 *
 * The difference between their scores is (-22) - 0 = -22. 
 *
 * **Constraints:**
 *
 * *   `n == stones.length`
 * *   2 <= n <= 105
 * *   -104 <= stones[i] <= 104
**/
public class Solution {
    public int stoneGameVIII(int[] stones) {
        if (stones == null || stones.length <= 1) {
            return 0;
        }
        int n = stones.length;
        for (int i = 1; i < n; i++) {
            stones[i] = stones[i - 1] + stones[i];
        }
        // presum stones[] is ready;
        // dp[n-2]
        int dp = stones[n - 1];
        // The game stops when only one stone is left in the row.
        for (int i = n - 3; i >= 0; i--) {
            dp = Math.max(stones[i + 1] - dp, dp);
        }
        return dp;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy