Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी++ में स्टोन गेम

मान लीजिए कि हमारे पास दो खिलाड़ी एलेक्स और ली हैं, वे पत्थरों के ढेर के साथ एक खेल खेलते हैं। ढेरों की संख्या सम संख्या में होती है जो एक पंक्ति में व्यवस्थित होती हैं, और प्रत्येक ढेर में कुछ संख्या में पत्थरों के ढेर होते हैं [i]। खेल का उद्देश्य सबसे अधिक पत्थरों के साथ समाप्त करना है। जब पत्थरों की कुल संख्या विषम होती है, तो कोई संबंध नहीं होता है। एलेक्स और ली बारी बारी से लेते हैं, एलेक्स पहले शुरू करते हैं। प्रत्येक मोड़ में, एक खिलाड़ी पंक्ति के आरंभ या अंत से पत्थरों का पूरा ढेर लेता है। यह तब तक जारी रहेगा जब तक कोई और ढेर नहीं बचेगा, जिस बिंदु पर सबसे अधिक पत्थरों वाला व्यक्ति जीत जाता है। मान लें कि एलेक्स और ली बेहतर तरीके से खेलते हैं, जांचें कि एलेक्स गेम जीतता है या नहीं। तो अगर इनपुट [5,3,4,5] जैसा है, तो परिणाम सही होगा, जैसा कि एलेक्स ने पहले शुरू किया है, वह केवल पहले 5 या अंतिम 5 ले सकता है। अब अगर वह पहले 5 लेता है, तो कि पंक्ति बन जाती है [3, 4, 5]। यदि ली 3 लेता है, उसके बाद, बोर्ड [4, 5] है, और एलेक्स 10 अंकों के साथ जीतने के लिए 5 लेता है। जब ली अंतिम 5 लेता है, तब बोर्ड [3, 4] होता है, और एलेक्स 9 अंकों के साथ जीतने के लिए 4 लेता है। तो यह इंगित करता है कि पहला 5 लेना एलेक्स के लिए एक विजयी कदम था, उत्तर सत्य है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=पाइल्स ऐरे का आकार

  • आकार n x n का मैट्रिक्स dp बनाएं, पूर्व आकार n + 1 नामक एक और सरणी बनाएं

  • मेरे लिए 0 से n - 1 की सीमा में

    • पूर्व[i + 1] :=पूर्व[i] + बवासीर[i]

  • l के लिए 2 से n की श्रेणी में −

    • i के लिए :=0, j :=l – 1, j

      • dp[i, j] :=अधिकतम बवासीर [j] + पूर्व [j] - पूर्व [i] - dp [i, j - 1] और बवासीर [i] + पूर्व [i + 2] - पूर्व [j] + डीपी [i + 1, जे]

  • डीपी [0, एन -1]> डीपी [0, एन -1] - पूर्व [एन] जब सच हो जाता है

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool stoneGame(vector<int>& piles) {
      int n = piles.size();
      vector < vector <int> > dp(n,vector <int>(n));
      vector <int> pre(n + 1);
      for(int i = 0; i < n; i++){
         pre[i + 1] = pre[i] + piles[i];
      }
      for(int l = 2; l <= n; l++){
         for(int i = 0, j = l - 1; j < n; i++, j++){
            dp[i][j] = max(piles[j] + pre[j] - pre[i] - dp[i][j - 1], piles[i] + pre[i + 2] - pre[j] +             dp[i       + 1][j]);
         }
      }
      return dp[0][n - 1] > dp[0][n - 1] - pre[n];
   }
};
main(){
   vector<int> v = {5,3,4,5};
   Solution ob;
   cout << (ob.stoneGame(v));
}

इनपुट

[5,3,4,5]

आउटपुट

1

  1. सी++ में जंप गेम IV

    मान लीजिए कि हमारे पास arr नामक पूर्णांकों की एक सरणी है। हम शुरुआत में इंडेक्स 0 पर हैं। एक चरण में हम इंडेक्स i से i + x पर जा सकते हैं जहां:i + x =0. j जहां:arr[i] और arr[j] समान हैं और i और j समान नहीं हैं। यहाँ n सरणी का आकार है। सरणी के अंतिम सूचकांक तक पहुंचने के लिए हमें न्यूनतम चरणों की संख

  1. सी++ में जंप गेम वी

    मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसे arr और एक पूर्णांक d कहा जाता है। एक चरण में हम इंडेक्स i से − . पर जा सकते हैं i + x जहां:i + x

  1. C++ में कॉइन गेम में विजेता की भविष्यवाणी करें

    इस खेल में, दो खिलाड़ी X और Y हैं। हमारा कार्य यह अनुमान लगाना है कि कौन खेल जीतेगा यदि दोनों बेहतर तरीके से खेलते हैं और X खेल शुरू करता है। खेल सिक्के के खेल में, N और M संख्या के सिक्कों के साथ दो ढेर होते हैं। खिलाड़ियों में से कोई एक खेल के लिए ढेर में से किसी एक को चुनता है। फिर कार्य ढेर क