Computer >> Máy Tính >  >> Lập trình >> C ++

Dự đoán Người chiến thắng trong C ++

Giả sử chúng ta có một mảng điểm là các số nguyên không âm. Người chơi đầu tiên chọn một trong các số từ một trong hai đầu của mảng, tiếp theo là người chơi thứ hai và sau đó là người chơi đầu tiên, v.v. Mỗi khi một người chơi chọn một số, số đó sẽ không có sẵn cho người chơi kia. Điều này tiếp tục cho đến khi tất cả các điểm đã được chọn. Người chơi có số điểm tối đa sẽ thắng. Vì vậy, nếu chúng ta có mảng điểm số, chúng ta phải dự đoán liệu người chơi 1 có phải là người chiến thắng hay không.

Vì vậy, nếu đầu vào là [1, 5, 233, 7], thì đầu ra sẽ là Đúng, vì người chơi thứ nhất đã chọn 1. Sau đó, người chơi thứ hai phải chọn giữa 5 và 7. Bất kể số thứ hai là gì. người chơi chọn, người chơi đầu tiên, có thể chọn 233. Cuối cùng, người chơi đầu tiên có nhiều điểm hơn (234) so ​​với người chơi thứ hai (12), vì vậy chúng ta cần trả về true vì người chơi đầu tiên có thể thắng.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • nếu n giống 1 thì -

    • trả về true

  • Xác định trình phát mảng 1 có kích thước:n x n, trình phát mảng 2 có kích thước n x n và tổng kích thước n x n.

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • player1 [i, j]:=-1

      • player2 [i, j]:=-1

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=i, khi j

      • nếu tôi giống với j, thì -

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

      • Nếu không

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

  • để khởi tạo độ dài:=1, khi độ dài <=n, cập nhật (tăng độ dài thêm 1), thực hiện -

    • để khởi tạo i:=0, khi i + length - 1

      • end:=i + length - 1

      • nếu tôi + 1 <=end, thì -

        • player1 [i, end]:=tối đa arr [i] + ((nếu player2 [i + 1, end] giống - 1 thì 0, ngược lại player2 [i + 1, end])) và arr [end ] + ((nếu player2 [i, end - 1] giống -1 thì ngược lại player2 [i, end - 1]))

      • Nếu không

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

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

  • trả về true khi player1 [0, n - 1]> =player2 [0, n - 1], ngược lại là false

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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));
}

Đầu vào

{1, 5, 233, 7}

Đầu ra

1