मान लीजिए कि 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