在 C++ 中预测获胜者


假设我们有一个分数数组,这些分数是非负整数。第一个玩家从数组的两端选择一个数字,然后是第二个玩家,然后是第一个玩家,依此类推。每次玩家选择一个数字后,该数字将不再供其他玩家使用。这种情况持续到所有分数都被选择。获得最高分数的玩家获胜。因此,如果我们有分数数组,我们必须预测玩家 1 是否获胜。

因此,如果输入类似于 [1, 5, 233, 7],则输出将为 True,因为第一个玩家选择了 1。然后第二个玩家必须在 5 和 7 之间选择。无论第二个玩家选择哪个数字,第一个玩家都可以选择 233。最后,第一个玩家的分数(234)高于第二个玩家的分数(12),因此我们需要返回 true,因为第一个玩家可以获胜。

为了解决这个问题,我们将遵循以下步骤:

  • 如果 n 等于 1,则:

    • 返回 true

  • 定义一个大小为 n x n 的数组 player1,一个大小为 n x n 的数组 player2,以及一个大小为 n x n 的数组 sum。

  • 初始化 i := 0,当 i < n 时,更新(i 增加 1),执行:

    • 初始化 j := 0,当 j < n 时,更新(j 增加 1),执行:

      • player1[i, j] := -1

      • player2[i, j] := -1

  • 初始化 i := 0,当 i < n 时,更新(i 增加 1),执行:

    • 初始化 j := i,当 j < n 时,更新(j 增加 1),执行:

      • 如果 i 等于 j,则:

        • sum[i, j] := arr[i]

      • 否则

        • sum[i, j] := arr[j] + sum[i, j - 1]

  • 初始化 length := 1,当 length <= n 时,更新(length 增加 1),执行:

    • 初始化 i := 0,当 i + length - 1 < n 时,更新(i 增加 1),执行:

      • end := i + length - 1

      • 如果 i + 1 <= end,则:

        • player1[i, end] := arr[i] + ((如果 player2[i + 1, end] 等于 - 1,则 0,否则 player2[i + 1, end])) 和 arr[end] + ((如果 player2[i, end - 1] 等于 -1,则 ,否则 player2[i, end - 1])) 的最大值

      • 否则

        • player1[i, end] := arr[i]

      • player2[i, end] := sum[i, end] - player1[i, end]

  • 当 player1[0, n - 1] >= player2[0, n - 1] 时返回 true,否则返回 false

示例

让我们查看以下实现以更好地理解:

实时演示

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
   lli solve(vector <int> arr, lli n){
      if (n == 1)
         return true;
      lli player1[n][n], player2[n][n], sum[n][n];
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            player1[i][j] = -1;
            player2[i][j] = -1;
         }
      }
      for (int i = 0; i < n; i++) {
         for (int j = i; j < n; j++) {
            if (i == j) {
               sum[i][j] = arr[i];
            }
            else {
               sum[i][j] = arr[j] + sum[i][j - 1];
            }
         }
      }
      for (int length = 1; length <= n; length++) {
         for (int i = 0; i + length - 1 < n; i++) {
            lli end = i + length - 1;
            if (i + 1 <= end)
               player1[i][end] = max(arr[i] + (player2[i + 1][end] == -1 ? 0 : player2[i + 1][end]), arr[end] + (player2[i][end - 1] == -1 ?: player2[i][end - 1]));
            else
               player1[i][end] = arr[i];
               player2[i][end] = sum[i][end] - player1[i][end];
            }
         }
         return player1[0][n - 1] >= player2[0][n - 1];
      }
      bool PredictTheWinner(vector<int>& nums) {
         return solve(nums, nums.size()) ;
   }
};
main(){
   Solution ob;
   vector<int> v = {1, 5, 233, 7};
   cout << (ob.PredictTheWinner(v));
}

输入

{1, 5, 233, 7}

输出

1

更新于: 2020年11月17日

239 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告