题目

image.png

思路

代码

  1. //1.暴力递归
  2. public boolean PredictTheWinner(int[] nums) {
  3. int sum = 0;
  4. for (int num : nums) {
  5. sum += num;
  6. }
  7. return (recur(nums, 0 , nums.length - 1, true) << 1) >= sum;
  8. }
  9. public int recur(int[] nums, int i, int j, boolean flag) {
  10. if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j)
  11. return 0;
  12. flag = !flag;
  13. if (flag)
  14. return Math.min(recur(nums, i + 1, j, flag), recur(nums, i, j - 1, flag));
  15. return Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]);
  16. }
  17. //2.备忘录
  18. int[][] dp;
  19. public boolean PredictTheWinner(int[] nums) {
  20. dp = new int[nums.length][nums.length];
  21. int sum = 0;
  22. for (int num : nums) {
  23. sum += num;
  24. }
  25. return (recur(nums, 0 , nums.length - 1, true) << 1) >= sum;
  26. }
  27. public int recur(int[] nums, int i, int j, boolean flag) {
  28. if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j)
  29. return 0;
  30. if (dp[i][j] != 0) return dp[i][j];
  31. flag = !flag;
  32. if (flag)
  33. dp[i][j] = Math.min(recur(nums, i + 1, j, flag), recur(nums, i, j - 1, flag));
  34. else
  35. dp[i][j] = Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]);
  36. return dp[i][j];
  37. }
  38. //3.根据动态规划思路修正后的备忘录
  39. int[][] dp;
  40. public boolean PredictTheWinner(int[] nums) {
  41. dp = new int[nums.length][nums.length];
  42. return recur(nums, 0 , nums.length - 1, true) >= 0;
  43. }
  44. public int recur(int[] nums, int i, int j, boolean flag) {
  45. if (i < 0 || j < 0 || i >= nums.length || j >= nums.length || i > j)
  46. return 0;
  47. if (dp[i][j] != 0) return dp[i][j];
  48. flag = !flag;
  49. if (flag)
  50. dp[i][j] = Math.min(recur(nums, i + 1, j, flag) - nums[i], recur(nums, i, j - 1, flag) - nums[j]);
  51. else
  52. dp[i][j] = Math.max(recur(nums, i + 1, j, flag) + nums[i], recur(nums, i, j - 1, flag) + nums[j]);
  53. return dp[i][j];
  54. }
  55. //4.动态规划
  56. public boolean PredictTheWinner(int[] nums) {
  57. int length = nums.length;
  58. int[][] dp = new int[length][length];
  59. for (int i = 0; i < length; i++) {
  60. dp[i][i] = nums[i];
  61. }
  62. for (int i = length - 2; i >= 0; i--) {
  63. for (int j = i + 1; j < length; j++) {
  64. dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);
  65. }
  66. }
  67. return dp[0][length - 1] >= 0;
  68. }
  69. //5.优化dp数组
  70. public boolean PredictTheWinner(int[] nums) {
  71. int length = nums.length;
  72. int[] dp = new int[length];
  73. for (int i = 0; i < length; i++) {
  74. dp[i] = nums[i];
  75. }
  76. for (int i = length - 2; i >= 0; i--) {
  77. for (int j = i + 1; j < length; j++) {
  78. dp[j] = Math.max(nums[i] - dp[j], nums[j] - dp[j - 1]);
  79. }
  80. }
  81. return dp[length - 1] >= 0;
  82. }

预测赢家
同类型-石头游戏