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

दिए गए योग वाला सब-मैट्रिक्स ढूंढें C++ में


इस समस्या में, हमें N*N आकार का एक 2D मैट्रिक्स और दो वेरिएबल योग और आकार दिए गए हैं। हमारा कार्य दिए गए योग वाला एक सब-मैट्रिक्स ढूंढना है।

हमें आकार*आकार का एक सब-मैट्रिक्स ढूंढना है जिसके तत्वों का योग दिए गए योग के बराबर हो।

उदाहरण से समझते हैं:

इनपुट: mat[][] = { {1, 5, 7, 9} {2, 4, 6, 8} {1, 2, 5, 6} {3, 6, 9, 3} } योग = 22 आकार = 2 आउटपुट: YES

व्याख्या:

आकार k का योग 22 वाला सबमैट्रिक्स है {5, 7} {4, 6}

समाधान दृष्टिकोण

समस्या का एक सरल समाधान सभी संभावित आकार*आकार आकार के सबएरे बनाना, उनका योग ज्ञात करना और फिर उसकी तुलना दिए गए योग मान से करना है। यदि दोनों बराबर हैं तो लौटाएं।

एक अन्य दृष्टिकोण डायनामिक प्रोग्रामिंग एल्गोरिथम की अवधारणा का उपयोग करना है। इस दृष्टिकोण में, हम एक DP सरणी बनाएंगे जो वर्तमान इंडेक्स तक का योग संग्रहीत करेगी, यानी DP[i][j] सरणी के सभी तत्वों का योग संग्रहीत करेगा, रो इंडेक्स 0 से i तक और कॉलम इंडेक्स 0 से j तक।

इस DP सरणी का उपयोग करके, हम किन्हीं दो शुरुआती इंडेक्स और अंतिम इंडेक्स के बीच का योग सूत्र का उपयोग करके गणना करेंगे,

$$\mathrm{sum((i_s,j_s)to(i_e,j_e))\:=\:DP[i_s][i_s]\:+\:DP[i_e][i_e]\:-\:DP[i_s][i_e]\:-\:DP[i_e][i_s]}$$

एल्गोरिथम

चरण 1 - (n+1)*(n+1) आकार का एक DP मैट्रिक्स बनाएं।

चरण 2 - मैट्रिक्स के प्रत्येक तत्व के लिए, वर्तमान इंडेक्स तक का योग ज्ञात करें।

चरण 3 - 0 से n तक सभी इंडेक्स के लिए, आकार*आकार के सब-मैट्रिक्स का योग सूत्र का उपयोग करके ज्ञात करें और currSum में संग्रहीत करें।

चरण 4 - यदि currSum == योग, तो true लौटाएं।

चरण 5 - false लौटाएं।

उदाहरण

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम:

#include <iostream> using namespace std; #define N 4 bool findSubMatWithSum(int size, int sum, int mat[N][N]){    int DP[N + 1][N + 1];    for (int i = 0; i < N; i++)    for (int j = 0; j < N; j++)    DP[i + 1][j + 1] = DP[i + 1][j] + DP[i][j + 1] - DP[i][j] + mat[i][j];    int currSum = 0;    for (int i = 0; i < N; i++)    for (int j = 0; j < N; j++) {       currSum = DP[i][j] + DP[(i + size)][(j + size)] - DP[(i + size)][j] - DP[i][(j + size)];       if (currSum == sum)       return true;    }    return false; } int main(){    int mat[N][N] = { { 1, 5, 7, 9 },    { 2, 4, 6, 8 },    { 1, 2, 5, 6 },    { 3, 6, 9, 3 } };    int size = 2;    int sum = 22;    if (findSubMatWithSum(size, sum, mat)) cout<<"Sub-Matrix of given size having the given sum is possible!";    else      cout<<"Sub-Matrix of given size having the given sum is not possible!"; }

आउटपुट

Sub-Matrix of given size having the given sum is possible!

  1. संतुलित BST में दिए गए योग वाली जोड़ी खोजें C++ में संतुलित BST में दिए गए योग वाली जोड़ी खोजें C++ में

    मान लीजिए हमारे पास एक संतुलित बाइनरी सर्च ट्री (BST) और एक लक्ष्य योग है, हमें एक ऐसी विधि परिभाषित करनी है जो जांचे कि क्या इसमें कोई ऐसी जोड़ी मौजूद है जिसका योग लक्ष्य योग के बराबर हो। ध्यान रखें कि बाइनरी सर्च ट्री अपरिवर्तनीय (immutable) है। उदाहरण के लिए, यदि इनपुट इस तरह का है: तो आउटपुट हो

  1. - C++ में दिए गए योग के साथ अधिकतम आकार का सबसेट

    समस्या कथनN तत्वों का एक एरे और योग दिया गया है। हमें उस अधिकतम आकार के सबसेट का आकार ढूंढना है जिसका योग दिए गए योग के बराबर हो।उदाहरणयदि इनपुट एरे arr = { 2, 3, 5, 10 } है और योग = 20 है तो आउटपुट 4 होगा क्योंकि −2 + 3 + 5 + 10 = 20 जो दिए गए योग के बराबर है।एल्गोरिदमहम इस समस्या को हल करने

  1. - C++ में दिए गए अंतर वाली जोड़ी ढूंढें

    समस्या विवरण एक सरणी A दी गई है जिसमें n विभिन्न तत्व हैं। हमें सरणी से एक जोड़ी (x, y) ढूंढनी है जिससे x और y का अंतर दिए गए अंतर d के बराबर हो। उदाहरण के लिए, यदि सरणी A = [10, 15, 26, 30, 40, 70] है और दिया गया अंतर 30 है, तो जोड़ियां (10, 40) और (30, 70) होंगी। हल दृष्टिकोण इस समस्या को हल करन