Key Observation:

Only the score difference
int sd
and tiebreakerbool tb
matter in the game's outcome, i.e., a player wins if and only if hissd + tb > 0
. 
Player 1 can be guaranteed to win with scores
a[0:N1]
if and only if Player 2 can be guaranteed to lose with remaining scoresa[1:N1]
ora[0:N2]
to overcome the deficit score ofa[0]
ora[N1]
.
Then it is easy to define a DFS routine to check if the current player can win with remaining score index range [s,e)
, current score difference sd
and tiebreaker tb
(true/false) by adding some default variables.
1liner, practically :)
bool PredictTheWinner(vector<int>& a, int s = 0, size_t e = INT_MAX, int sd = 0, bool tb = true) {
return s==e? sd+tb>0 : !PredictTheWinner(a, s+1, e=min(e,a.size()), sda[s], !tb) 
!PredictTheWinner(a, s, e1, sda[e1], !tb);
}
Since the array length a.size() <= 20
, I didn't bother to memorize previous DFS results.