Categories

  • Array
  • Math
  • Dynamic Programming
  • Recursion
  • Game Theory

Templates

package array.recursive;

import java.util.Arrays;
import java.util.stream.IntStream;

public class PredictTheWinner {

    public boolean predictTheWinner(int[] nums) {
        int n           = nums.length;
        int[] prefixSum = new int[n + 1];
        int[][] memo    = new int[n][n];

        IntStream.rangeClosed(1, n).forEach(i -> prefixSum[i] = prefixSum[i - 1] + nums[i - 1]);
        IntStream.range(0, n).forEach(row -> Arrays.fill(memo[row], Integer.MIN_VALUE));

        int max = dfs(nums, prefixSum, memo, 0, nums.length - 1);
        return max >= prefixSum[n] - max;
    }

    private int dfs(int[] nums, int[] prefixSum, int[][] memo, int left, int right) {
        if (memo[left][right] != Integer.MIN_VALUE)
            return memo[left][right];

        if (left == right)
            return memo[left][right] = nums[left];

        int sum       = prefixSum[right + 1] - prefixSum[left];
        int leftMove  = dfs(nums, prefixSum, memo, left + 1, right);
        int rightMove = dfs(nums, prefixSum, memo, left, right - 1);

        return memo[left][right] = Math.max(sum - leftMove, sum - rightMove);
    }

}

Type to search.