Predict the Winner

medium dp game theory recursion

Problem

Players take turns picking from either end of nums; both play optimally to maximise their score. Return true iff player 1 can win (tie counts as a win).

Inputnums = [1,5,2]
Outputfalse
dp[i][j] = max(nums[i] − dp[i+1][j], nums[j] − dp[i][j-1]); answer = dp[0][n-1] ≥ 0.

def predict_the_winner(nums):
    n = len(nums)
    dp = [row[:] for row in [[0]*n]*n]
    for i in range(n): dp[i][i] = nums[i]
    for L in range(2, n+1):
        for i in range(n-L+1):
            j = i + L - 1
            dp[i][j] = max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1])
    return dp[0][n-1] >= 0
function PredictTheWinner(nums) {
  const n = nums.length;
  const dp = Array.from({ length: n }, () => new Array(n).fill(0));
  for (let i = 0; i < n; i++) dp[i][i] = nums[i];
  for (let L = 2; L <= n; L++)
    for (let i = 0; i + L <= n; i++) {
      const j = i + L - 1;
      dp[i][j] = Math.max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1]);
    }
  return dp[0][n-1] >= 0;
}
class Solution {
    public boolean PredictTheWinner(int[] nums) {
        int n = nums.length;
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) dp[i][i] = nums[i];
        for (int L = 2; L <= n; L++)
            for (int i = 0; i + L <= n; i++) {
                int j = i + L - 1;
                dp[i][j] = Math.max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1]);
            }
        return dp[0][n-1] >= 0;
    }
}
bool PredictTheWinner(vector& nums) {
    int n = nums.size();
    vector> dp(n, vector(n, 0));
    for (int i = 0; i < n; i++) dp[i][i] = nums[i];
    for (int L = 2; L <= n; L++)
        for (int i = 0; i + L <= n; i++) {
            int j = i + L - 1;
            dp[i][j] = max(nums[i] - dp[i+1][j], nums[j] - dp[i][j-1]);
        }
    return dp[0][n-1] >= 0;
}
Time: O(n²) Space: O(n²)