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

C++ में एक-दूसरे को अलग-अलग टोपियां पहनने के तरीकों की संख्या


मान लीजिए कि n लोग हैं और 40 विभिन्न प्रकार की टोपियां हैं जिन्हें 1 से 40 तक लेबल किया गया है। अब एक 2डी सूची दी गई है जिसे टोपियां कहा जाता है, जहां टोपियां[i] सभी टोपियों की एक सूची है i-वें व्यक्ति द्वारा पसंद किया जाता है। हमें उन तरीकों की संख्या का पता लगाना है जिनसे n लोग एक-दूसरे को अलग-अलग टोपियाँ पहनते हैं। उत्तर बहुत बड़ा हो सकता है, इसलिए उत्तर मॉड्यूल 10^9 + 7 लौटाएं।

इसलिए, यदि इनपुट [[4,6,2], [4,6]] जैसा है, तो आउटपुट 4 होगा, क्योंकि चुनने के 4 अलग-अलग तरीके हैं, ये हैं [4,6], [6, 4], [2,4], [2,6]।

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

  • मी =10^9 + 7

  • 55 x 2^11

    आकार के 2D सरणी dp को परिभाषित करें
  • एक 2डी सरणी को परिभाषित करें v

  • फ़ंक्शन ऐड () को परिभाषित करें, इसमें a, b,

    . लगेगा
  • वापसी ((एक मॉड एम) + (बी मॉड एम)) मॉड एम

  • एक फ़ंक्शन हल करें () को परिभाषित करें, यह idx, मास्क,

    लेगा
  • यदि मास्क req के समान है, तो -

    • वापसी 1

  • यदि idx 42 के समान है, तो -

    • वापसी 0

  • अगर dp[idx, mask] -1 के बराबर नहीं है, तो -

    • वापसी डीपी [आईडीएक्स, मुखौटा]

  • रिट:=जोड़ें (रिट, हल करें (आईडीएक्स + 1, मास्क))

  • सभी के लिए मैं v[idx]sk में))

    • अगर (शिफ्ट मास्क i बिट टू राइट) सम है, तो

      • रिट =जोड़ें (रिट, हल करें (idx + 1, मास्क या 2^i))

  • dp[idx, mask] :=ret

  • वापसी रिट

  • मुख्य विधि से निम्न कार्य करें -

  • -1 के साथ dp को इनिशियलाइज़ करें

  • n :=x का आकार

  • v अपडेट करें ताकि इसमें 50 तत्व शामिल हो सकें

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • x[i]

      . में सभी j के लिए
      • v[j]

        . के अंत में i डालें
  • अनुरोध :=(2^n) - 1

  • रिट:=हल करें (0, 0)

  • वापसी रिट

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
int m = 1e9 + 7;
int dp[55][1 << 11];
class Solution {
   public:
   vector<vector<int> > v;
   int req ;
   int add(lli a, lli b){
      return ((a % m) + (b % m)) % m;
   }
   int solve(int idx, int mask){
      if (mask == req)
      return 1;
      if (idx == 42)
      return 0;
      if (dp[idx][mask] != -1) {
         return dp[idx][mask];
      }
      int ret = add(ret, solve(idx + 1, mask));
      for (int i : v[idx]) {
         if (!((mask >> i) & 1)) {
            ret = add(ret, solve(idx + 1, mask | (1 << i)));
         }
      }
      return dp[idx][mask] = ret;
   }
   int numberWays(vector<vector<int>>& x){
      memset(dp, -1, sizeof dp);
      int n = x.size();
      v.resize(50);
      for (int i = 0; i < x.size(); i++) {
         for (int j : x[i]) {
            v[j].push_back(i);
         }
      }
      req = (1 << n) - 1;
      int ret = solve(0, 0);
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{4,6,2},{4,6}};
   cout << (ob.numberWays(v));
}

इनपुट

{{4,6,2},{4,6}}

आउटपुट

4

  1. N × 3 ग्रिड को C++ में पेंट करने के तरीकों की संख्या

    मान लीजिए कि हमारे पास आकार n x 3 का ग्रिड है और हम ग्रिड के प्रत्येक सेल को तीन रंगों में से एक के साथ पेंट करना चाहते हैं। रंग लाल, पीला या हरा हैं। अब एक बाधा है कि दो आसन्न कोशिकाओं का रंग समान नहीं है। हमारे पास ग्रिड की पंक्तियों की संख्या n है। हमें यह पता लगाना है कि हम इस ग्रिड को कितने तरी

  1. सी ++ में तर्कों की परिवर्तनीय संख्या

    कभी-कभी, आप एक ऐसी स्थिति में आ सकते हैं, जब आप एक ऐसा फ़ंक्शन करना चाहते हैं, जो पैरामीटर की पूर्वनिर्धारित संख्या के बजाय तर्कों की चर संख्या, यानी पैरामीटर ले सकता है। सी/सी++ प्रोग्रामिंग भाषा इस स्थिति के लिए एक समाधान प्रदान करती है और आपको एक फ़ंक्शन को परिभाषित करने की अनुमति है जो आपकी आवश्

  1. C++ में CHAR_BIT

    CHAR_BIT चार में बिट्स की संख्या है। इसे C++ भाषा में “limits.h” हेडर फाइल में घोषित किया गया है। यह 8-बिट प्रति बाइट का होता है। यहाँ C++ भाषा में CHAR_BIT का एक उदाहरण दिया गया है, उदाहरण #include <bits/stdc++.h> using namespace std; int main() {    int x = 28;    int a