मान लीजिए कि हमारे पास स्कोर की एक सरणी है जो गैर-ऋणात्मक पूर्णांक हैं। पहला खिलाड़ी सरणी के दोनों छोर से एक संख्या चुनता है, उसके बाद दूसरा खिलाड़ी और फिर पहला खिलाड़ी इत्यादि। हर बार जब कोई खिलाड़ी कोई नंबर चुनता है, तो वह नंबर दूसरे खिलाड़ी के लिए उपलब्ध नहीं होगा। यह तब तक जारी रहता है जब तक कि सभी अंकों का चयन नहीं कर लिया जाता। जिस खिलाड़ी को सबसे अधिक अंक मिलते हैं वह जीत जाता है। इसलिए, यदि हमारे पास स्कोर सरणी है, तो हमें यह अनुमान लगाना होगा कि खिलाड़ी 1 विजेता है या नहीं।
इसलिए, यदि इनपुट [1, 5, 233, 7] जैसा है, तो आउटपुट ट्रू होगा, जैसा कि पहले खिलाड़ी ने 1 चुना है। फिर दूसरे खिलाड़ी को 5 और 7 के बीच चयन करना होगा। खिलाड़ी चुनता है, पहला खिलाड़ी 233 चुन सकता है। अंत में, पहले खिलाड़ी के पास दूसरे खिलाड़ी (12) की तुलना में अधिक स्कोर (234) है, इसलिए हमें सही वापसी करने की आवश्यकता है क्योंकि पहला खिलाड़ी जीत सकता है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
यदि n 1 के समान है, तो -
-
सही लौटें
-
-
आकार के एक सरणी खिलाड़ी1 को परिभाषित करें:n x n, एक सरणी खिलाड़ी2 आकार n x n, और आकार n x n का योग।
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
इनिशियलाइज़ j :=0 के लिए, जब j
-
खिलाड़ी1[i, j] :=-1
-
खिलाड़ी 2[i, j] :=-1
-
-
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
इनिशियलाइज़ j :=i के लिए, जब j
-
यदि i, j के समान है, तो -
-
योग [i, j] :=arr[i]
-
-
अन्यथा
-
योग[i, j] :=arr[j] + sum[i, j-1]
-
-
-
-
प्रारंभिक लंबाई के लिए:=1, जब लंबाई <=n, अद्यतन (लंबाई 1 से बढ़ाएं), करें -
-
इनिशियलाइज़ i :=0 के लिए, जब i + लंबाई - 1
-
अंत:=मैं + लंबाई - 1
-
अगर मैं + 1 <=अंत, तो -
-
खिलाड़ी 1 [i, अंत]:=गिरफ्तारी की अधिकतम [i] + ((यदि खिलाड़ी 2 [i + 1, अंत] 1 के समान है, तो 0, अन्यथा खिलाड़ी 2 [i + 1, अंत])) और गिरफ्तारी [अंत ] + ((यदि खिलाड़ी 2 [i, अंत - 1] -1 के समान है, तो , अन्यथा खिलाड़ी 2 [i, अंत - 1]))
-
-
अन्यथा
-
खिलाड़ी1[i, अंत] :=गिरफ्तारी[i]
-
-
खिलाड़ी 2 [i, अंत]:=योग [i, अंत] - खिलाड़ी 1 [i, अंत]
-
-
-
जब खिलाड़ी1[0, n - 1]>=खिलाड़ी2[0, n - 1], अन्यथा असत्य हो, तो सही लौटें
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#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