题目
思路
代码
//1.暴力递归 public boolean PredictTheWinner(int[] nums) { int sum = 0; for (int num : nums) { sum += num; } return (recur(nums, 0 , nums.length - 1, true) << 1) >= sum; } public int recur(int[] nums, int i, int j, boolean flag) { if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j) return 0; flag = !flag; if (flag) return Math.min(recur(nums, i + 1, j, flag), recur(nums, i, j - 1, flag)); return Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]); } //2.备忘录 int[][] dp; public boolean PredictTheWinner(int[] nums) { dp = new int[nums.length][nums.length]; int sum = 0; for (int num : nums) { sum += num; } return (recur(nums, 0 , nums.length - 1, true) << 1) >= sum; } public int recur(int[] nums, int i, int j, boolean flag) { if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j) return 0; if (dp[i][j] != 0) return dp[i][j]; flag = !flag; if (flag) dp[i][j] = Math.min(recur(nums, i + 1, j, flag), recur(nums, i, j - 1, flag)); else dp[i][j] = Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]); return dp[i][j]; } //3.根据动态规划思路修正后的备忘录 int[][] dp; public boolean PredictTheWinner(int[] nums) { dp = new int[nums.length][nums.length]; return recur(nums, 0 , nums.length - 1, true) >= 0; } public int recur(int[] nums, int i, int j, boolean flag) { if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j) return 0; if (dp[i][j] != 0) return dp[i][j]; flag = !flag; if (flag) dp[i][j] = Math.min(recur(nums, i + 1, j, flag) - nums[i], recur(nums, i, j - 1, flag) - nums[j]); else dp[i][j] = Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]); return dp[i][j]; } //4.动态规划 public boolean PredictTheWinner(int[] nums) { int length = nums.length; int[][] dp = new int[length][length]; for (int i = 0; i < length; i++) { dp[i][i] = nums[i]; } for (int i = length - 2; i >= 0; i--) { for (int j = i + 1; j < length; j++) { dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]); } } return dp[0][length - 1] >= 0; } //5.优化dp数组 public boolean PredictTheWinner(int[] nums) { int length = nums.length; int[] dp = new int[length]; for (int i = 0; i < length; i++) { dp[i] = nums[i]; } for (int i = length - 2; i >= 0; i--) { for (int j = i + 1; j < length; j++) { dp[j] = Math.max(nums[i] - dp[j], nums[j] - dp[j - 1]); } } return dp[length - 1] >= 0; }
预测赢家
同类型-石头游戏