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

संतुलित भाव जैसे कि दिए गए पदों में C++ में शुरुआती कोष्ठक हैं?

किसी दिए गए पूर्णांक m और पदों की एक सरणी 'स्थिति []' (1 <=लंबाई (स्थिति []) <=2m) के मामले में, उचित ब्रैकेट अभिव्यक्तियों के तरीकों की संख्या पाएं जिन्हें लंबाई 2m का निर्माण किया जा सकता है जैसे कि दी गई पोजीशन में ओपनिंग ब्रैकेट होता है।

नोट:स्थिति [] सरणी (1-आधारित अनुक्रमण) [0, 1, 1, 0] के रूप में प्रदान की जाती है। यहां 1 उन स्थितियों को इंगित करता है जिन पर ओपन ब्रैकेट सेट किया जाना चाहिए। मान 0 के मामले में, या तो उद्घाटन या समापन ब्रैकेट सेट किया जा सकता है।

उदाहरण

Input: n = 2, position[] = [1, 0, 1, 0]
Output: 1
The only possibility is given below:
[ ] [ ]
In this case, recursive and recursion implementing memorization approach will be explained.

एल्गोरिदम

हमें दिए गए सरणी adj1(मानना) में खुले कोष्ठकों के साथ सभी पदों को 1 के रूप में चिह्नित करना है।

हम इस तरह से एक पुनरावर्ती लूप चलाते हैं -

  • यदि कुल कोष्ठकों की संख्या (खोलने वाले कोष्ठकों को बंद करने वाले कोष्ठकों से घटाकर) शून्य से कम है, तो 0 लौटाएँ।

  • यदि सूचकांक m तक पहुँचता है और यदि कुल कोष्ठक 0 के बराबर है, तो एक समाधान उपलब्ध है और 1 लौटाएँ अन्यथा 0 लौटाएँ।

  • यदि अनुक्रमणिका मान में 1 पूर्व-असाइन किया गया है, तो हमें फ़ंक्शन को अनुक्रमणिका+1 के साथ पुनरावर्ती रूप से वापस करना होगा और कुल कोष्ठकों को बढ़ाना होगा।

  • अन्यथा हमें उस स्थिति या अनुक्रमणिका पर खुले कोष्ठकों को सम्मिलित करके और उस अनुक्रमणिका में कुल कोष्ठकों को 1 + बढ़ाकर कुल कोष्ठकों को बढ़ाकर और कुल कोष्ठकों को 1 से घटाकर और m तक अगले सूचकांक पर आगे बढ़ते हुए पुनरावर्ती रूप से वापस करना होगा।

उपरोक्त एल्गोरिथम के मामले में पुनरावर्ती समाधान निम्नलिखित है -

उदाहरण

// C++ application of above method implementing Recursion
#include <bits/stdc++.h>
using namespace std;
// Function to locate or find Number of proper bracket expressions
int find(int index1, int openbrk1, int m, int adj1[]){
   // If open-closed brackets less than 0
   if (openbrk1 < 0)
   return 0;
   // If index reaches the end of expression
   if (index1 == m) {
      // If brackets are balanced
      if (openbrk1 == 0)
      return 1;
      else
      return 0;
   }
   // If the current index has assigned open bracket
   if (adj1[index1] == 1) {
      // We have to move forward increasing the
      // length of open brackets
      return find(index1 + 1, openbrk1 + 1, m, adj1);
   }
   else {
      // We have to move forward by inserting open as well
      // as closed brackets on that index
      return find(index1 + 1, openbrk1 + 1, m, adj1)
      + find(index1 + 1, openbrk1 - 1, m, adj1);
   }
}
// Driver Code
int main(){
   int m = 2;
   // Open brackets at position 1
   int adj1[4] = { 1, 0, 0, 0 };
   // Calling the find function to calculate the answer
   cout << find(0, 0, 2 * m, adj1) << endl;
   return 0;
}

आउटपुट

2

याद रखा दृष्टिकोण - मेमोराइजेशन को लागू करके उपरोक्त एल्गोरिदम की समय जटिलता को बेहतर या अनुकूलित किया जा सकता है।

केवल एक ही काम किया जाना है, पिछले पुनरावृत्तियों के परिणामों को संग्रहीत करने के लिए एक सरणी को लागू करना ताकि मान की गणना पहले से ही एक ही फ़ंक्शन को एक से अधिक बार कॉल करने की आवश्यकता न हो।

निम्नलिखित आवश्यक कार्यान्वयन है

// C++ application of above method implementing memorization
#include <bits/stdc++.h>
using namespace std;
#define M 1000
// Function to locate or find Number of proper bracket expressions
int find(int index1, int openbrk1, int m,
int dp1[M][M], int adj1[]){
   // If open-closed brackets is less than 0
   if (openbrk1 < 0)
   return 0;
   // If index attains or reaches the end of expression
   if (index1 == m) {
      // If brackets are balanced
      if (openbrk1 == 0)
      return 1;
      else
      return 0;
   }
   // If already stored in dp1
   if (dp1[index1][openbrk1] != -1)
   return dp1[index1][openbrk1];
   // If the current index has assigned open bracket
   if (adj1[index1] == 1) {
      // We have to move forward increasing the length of open brackets
      dp1[index1][openbrk1] = find(index1 + 1,
      openbrk1 + 1, m, dp1, adj1);
   }
   else {
      // We have to move forward by inserting open as
      // well as closed brackets on that index
      dp1[index1][openbrk1] = find(index1 + 1, openbrk1 + 1, m, dp1, adj1) + find(index1 + 1,             openbrk1 -    1, m, dp1, adj1);
   }
   // We have to return the answer
   return dp1[index1][openbrk1];
}
// Driver Code
int main(){
   // dp1 array to precalculate the answer
   int dp1[M][M];
   int m = 2;
   memset(dp1, -1, sizeof(dp1));
   // Open brackets at position 1
   int adj1[4] = { 1, 0, 0, 0 };
   // We have to call the find function to compute the answer
   cout<< find(0, 0, 2 * m, dp1, adj1) << endl;
   return 0;
}

आउटपुट

2

समय जटिलता:O(N2)


  1. एक सरणी में सभी जोड़े (ए, बी) खोजें जैसे कि सी ++ में% बी =के

    मान लीजिए कि हमारे पास एक सरणी ए है, उस सरणी से, हमें सभी जोड़े (ए, बी) प्राप्त करना है जैसे कि ए% बी =के। मान लीजिए कि सरणी A =[2, 3, 4, 5, 7] और k =3 है, तो जोड़े (7, 4), (3, 4), (3, 5), (3, 7) हैं। इसे हल करने के लिए, हम सूची को देखेंगे और जांचेंगे कि दी गई शर्त संतोषजनक है या नहीं। उदाहरण #inc

  1. ऐसी संख्या x ज्ञात कीजिए कि C++ में x और उसके अंकों का योग दिए गए n के बराबर हो

    यहां हम एक समस्या देखेंगे, जहां हम एक संख्या n लेते हैं, हमें एक और मान x ज्ञात करना होता है, जैसे कि x का x + अंकों का योग दी गई संख्या n के समान हो। मान लीजिए n का मान 21 है। यह प्रोग्राम एक संख्या x =15, 15 + अंकों का योग 15, यानी 15 + 1 + 5 =21 =n के रूप में लौटाएगा। इस समस्या को हल करने के लिए

  1. दी गई श्रेणी में एक अलग जोड़ी (x, y) खोजें जैसे कि x, y को C++ में विभाजित करता है

    यहां हम एक दिलचस्प समस्या देखेंगे, हमें एक जोड़ी (x, y) मिलेगी, जहां x और y श्रेणी में हैं इसलिए l <=x, y <=r, जोड़ी में एक संपत्ति होगी, x का मान y को विभाजित करता है . यदि कई जोड़े उपलब्ध हैं, तो केवल एक को चुनें। हम इस समस्या को O(1) समय में हल कर सकते हैं, यदि हमें निचली सीमा l और 2l का मान प्र