Alice and Bob continue their games with piles of stones. There are several stones **arranged in a row**, and each stone has an associated value which is an integer given in the array `stoneValue`. Alice and Bob take turns, with **Alice starting first**. On each player's turn, that player can take `1`, `2`, or `3` stones from the **first** remaining stones in the row. The score of each player is the sum of the values of the stones taken. The score of each player is `0` initially. The objective of the game is to end with the highest score, and the player with the highest score wins the game. The game could end in a draw. Assume Alice and Bob **play optimally**. Return `"Alice"` if Alice will win, `"Bob"` if Bob will win, or `"Tie"` if they will end the game with the same score.
Example 1
Input: stoneValue = [1,2,3,7]
Output: Bob
Explanation: If Alice takes only 1, Bob takes 2 + 3 + 7 = 12. If she takes 1 + 2, Bob takes 3 + 7 = 10. If she takes 1 + 2 + 3 = 6, Bob takes 7. In every case Bob ends ahead, so Bob wins.
Example 2
Input: stoneValue = [1,2,3,-9]
Output: Alice
Explanation: Alice takes all three of 1, 2, 3 (score 6), forcing Bob to take the -9. Alice wins.
Example 3
Input: stoneValue = [1,2,3,6]
Output: Tie
Explanation: Alice's best move is to take 1 + 2 + 3 = 6, which leaves Bob exactly 6. Any smaller take lets Bob grab more, so the game ends in a tie.
Let dp[i] be the best score DIFFERENCE (mover minus opponent) reachable from stoneValue[i:]. Taking k = 1, 2, or 3 stones scores their running sum and hands the rest to the opponent, whose advantage subtracts. Scan right to left; the sign of dp[0] decides the winner.
Run checks all cases above. Submit evaluates all test cases.