Problem

Alice and Bob play a game with piles of stones. There are an even number of piles arranged in a row, and each pile has a positive integer number of stones piles[i].

The objective of the game is to end with the most stones. The total number of stones across all the piles is odd, so there are no ties.

Alice and Bob take turns, with Alice starting first. Each turn, a player takes the entire pile of stones either from the beginning or from the end of the row. This continues until there are no more piles left, at which point the person with the most stones wins.

Assuming Alice and Bob play optimally, return true if Alice wins the game, or false if Bob wins.

Examples

Example 1:

Input: piles = [5,3,4,5]
Output: true
Explanation: 
Alice starts first, and can only take the first 5 or the last 5.
Say she takes the first 5, so that the row becomes [3, 4, 5].
If Bob takes 3, then the board is [4, 5], and Alice takes 5 to win with 10 points.
If Bob takes the last 5, then the board is [3, 4], and Alice takes 4 to win with 9 points.
This demonstrated that taking the first 5 was a winning move for Alice, so we return true.

Example 2:

Input: piles = [3,7,2,3]
Output: true

Solution

Method 1 - Alice always wins

The problem involves a game theory scenario where Alice and Bob play optimally with piles of stones. The key insights here are:

  1. Number of piles is even.
  2. Total number of stones is odd, ensuring no tie.
  3. Optimal play by both Alice and Bob.

Since the number of piles is even and both play optimally, it defaults mathematically that the starting player (Alice) always has a winning strategy. Here’s a step-by-step reasoning for why Alice always wins:

  1. Since Alice can always choose either the first or the last pile, she can see all piles and predict the results of future moves.
  2. With an even number of piles, Alice can always choose a strategy that leaves Bob in a situation where Bob cannot influence the majority of high-value piles due to their alternate turn structure.

Given the constraints provided, Alice can always take an approach to ensure she ends up with more stones than Bob. Thus, the result of the function should return true.

Code

Java
public class StoneGame {
    public static boolean stoneGame(int[] piles) {
        // Alice always wins with optimal play due to even number of piles and
        // odd total of stones
        return true;
    }
}
Python
def stoneGame(piles):
    # Alice always wins with optimal play due to even number of piles and odd total of stones
    return True

Complexity

  • Time: O(1)
  • Space: O(1)