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

C++ में दिए गए आकार के बाइनरी सब-मैट्रिसेस की संख्या पर प्रश्न

इस समस्या में, हमें nXm आकार का एक बाइनरी मैट्रिक्स बिन [] [] दिया जाता है। हमारा कार्य सभी q प्रश्नों को हल करना है। क्वेरी (x, y) के लिए, हमें x*x आकार के सबमैट्रिक्स की संख्या को इस तरह खोजने की आवश्यकता है कि सरणी y (बाइनरी नंबर) के सभी तत्व।

समस्या का विवरण

यहां, हमें किसी दिए गए आकार के उप-मैट्रिक्स की कुल संख्या की गणना करने की आवश्यकता है जिसमें दो बिट्स में से केवल एक होता है यानी सब-मैट्रिक्स सभी तत्व 0/1 होंगे।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट

n = 3 , m = 4
bin[][] = {{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}}
q = 1
q1 = (2, 1)

आउटपुट

2

स्पष्टीकरण

सभी तत्व 1 के साथ आकार 2 के सभी उप-मैट्रिक्स हैं -

{{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}}
{{ 1, 1, 0, 1}
{ 1, 1, 1, 0}
{ 0, 1, 1, 1}}

इस समस्या का समाधान डायनामिक प्रोग्रामिंग . का उपयोग कर रहा है दृष्टिकोण। हल करने के लिए, हम उसी बिट के सबसे बड़े सबमैट्रिक्स को स्टोर करने के लिए एक 2D मैट्रिक DP[][] बनाए रखेंगे। यानी DP[i][j] उप-मैट्रिक्स का मान संग्रहीत करेगा जिसका अंतिम सूचकांक (i, j) है, और सभी तत्व समान हैं।

आपकी समझ के लिए, यदि डीपी [4] [5] =2, बिन [3] [4], बिन [3] [5], बिन [4] [4] और बिन [4] [5] में तत्व समान हैं। ।

तो, DP[i][j] खोजने के लिए, हमारे पास दो मामले हैं -

केस 1 - यदि i =0 orj =0 :DP[i][j] =1, क्योंकि केवल एक उप-मैट्रिक्स संभव हो सकता है।

केस 2 - अन्यथा, बिन[i-(k-1)][j] =bin[i][j - (k-1)]…:इस मामले में DP[i][j] =min(DP[i][i][i] j-1] , DP[i -1][j], DP[i-1][j-1] ) + 1. यह सब-मैट्रिक्स में योगदान देगा, जैसे हमें चाहिए। आइए k =2 के मामले को सामान्य करें, यानी यदि हम आकार 2X2 के उप-मैट्रिक्स पर विचार करें। फिर हमें यह जांचने की आवश्यकता है कि क्या बिन [i] [j] =बिन [i] [j - 1] =बिन [i- 1] [j] =बिन [i -1] [j -1], यदि यह संभव है फिर, हम k =2 के लिए DP[i][j] पाएंगे।

यदि केस 2 की शर्तें पूरी नहीं होती हैं, तो हम DP[i][j] =1 सेट करेंगे, जिसे डिफ़ॉल्ट मान के रूप में माना जा सकता है।

DP[i][j] का यह मान एक सेट बिट या अनसेट बिट के लिए हो सकता है। हम यह देखने के लिए बिन [i] [j] के मूल्य की जांच करेंगे कि k मान किस सेट या अनसेट मानों से संबंधित है। फ़्रीक्वेंसी खोजने के लिए, हम दो सरणियाँ बनाएंगे, ज़ीरोफ़्रीक्वेंसी, सब-मैट्रिक्स की फ़्रीक्वेंसी को स्टोर करने के लिए जो 0 के लिए जेनरेट होती है। और एक फ़्रीक्वेंसी सब-मैट्रिक्स की फ़्रीक्वेंसी को स्टोर करने के लिए जो 1. के लिए जेनरेट होती है।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include <iostream>
using namespace std;
#define N 3
#define M 4

int min(int a, int b, int c) {
   if (a <= b && a <= c)
   return a;
   else if (b <= a && b <= c)
   return b;
   else
   return c;
}

int solveQuery(int n, int m, int bin[N][M], int x, int y){
   int DP[n][m], max = 1;
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
         if (i == 0 || j == 0)
         DP[i][j] = 1;
         else if ((bin[i][j] == bin[i - 1][j]) && (bin[i][j] == bin[i][j - 1]) && (bin[i][j] == bin[i - 1][j - 1])) {
            DP[i][j] = min(DP[i - 1][j], DP[i - 1][j - 1], DP[i][j - 1]) + 1;
            if (max < DP[i][j])
            max = DP[i][j];
         }
         else
         DP[i][j] = 1;
      }
   }
   int zeroFrequency[n+m] = { 0 }, oneFrequency[n+m] = { 0 };
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
         if (bin[i][j] == 0)
         zeroFrequency[DP[i][j]]++;
         else
         oneFrequency[DP[i][j]]++;
      }
   }
   for (int i = max - 1; i >= 0; i--) {
      zeroFrequency[i] += zeroFrequency[i + 1];
      oneFrequency[i] += oneFrequency[i + 1];
   }
   if (y == 0)
   return zeroFrequency[x];
   else
   return oneFrequency[x];
}
int main(){
   int n = 3, m = 4;
   int mat[N][M] =
   {{ 1, 1, 0, 1},
   { 1, 1, 1, 0},
   { 0, 1, 1, 1}};
   int Q = 2;
   int query[Q][2] = {{ 2, 1}, { 1, 0}};
   for(int i = 0; i < Q; i++){
      cout<<"For Query "<<(i+1)<<": The number of Binary sub-matrices of Given size is "            <<solveQuery(n, m, mat, query[i][0], query[i][1])<<"\n";
   }
   return 0;
}

आउटपुट

For Query 1: The number of Binary sub-matrices of Given size is 2
For Query 2: The number of Binary sub-matrices of Given size is 3

  1. C++ में दिए गए आकार के आयत के अंदर संभव रंबी की संख्या की गणना करें

    हमें ऊंचाई X चौड़ाई के रूप में आयामों के साथ एक आयत दिया गया है। आयत को एक 2D निर्देशांक प्रणाली पर दर्शाया गया है जिसमें बिंदु (0,0) पर बाएँ-निचले कोने हैं। तो लक्ष्य इस आयत के अंदर संभव रोम्बी की संख्या को गिनना है ताकि ये सभी शर्तें पूरी हों - समचतुर्भुज का क्षेत्रफल 0 से अधिक होता है। समचत

  1. जाँच करें कि क्या दिया गया बाइनरी ट्री C++ में SumTree है

    यहां हम देखेंगे कि कैसे जांचा जाए कि बाइनरी ट्री सम-ट्री है या नहीं। अब प्रश्न यह है कि योग वृक्ष क्या है। सम-ट्री एक बाइनरी ट्री है जहाँ एक नोड अपने बच्चों का योग मान रखेगा। पेड़ की जड़ में उसके नीचे के सभी तत्वों का योग होगा। यह सम-वृक्ष का उदाहरण है - इसे चेक करने के लिए हम एक आसान सी ट्रिक अप

  1. सी ++ प्रोग्राम ऑक्टल नंबर को बाइनरी नंबर में कनवर्ट करने के लिए

    एक कंप्यूटर सिस्टम में, बाइनरी नंबर बाइनरी नंबर सिस्टम में व्यक्त किया जाता है जबकि ऑक्टल नंबर ऑक्टल नंबर सिस्टम में होता है। बाइनरी नंबर बेस 2 में है जबकि ऑक्टल नंबर बेस 8 में है। बाइनरी नंबर और उनके संगत ऑक्टल नंबर के उदाहरण इस प्रकार हैं - बाइनरी नंबर अष्टाधारी संख्या 01101 15 00101 5 10110