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

C++ में 0 और 1 के सेगमेंट की अधिकतम लंबाई

समस्या कथन

इकाई और शून्य से मिलकर बनी एक स्ट्रिंग को देखते हुए। कार्य स्ट्रिंग के खंडों की अधिकतम लंबाई का पता लगाना है जैसे कि प्रत्येक खंड में 1 की संख्या 0 से अधिक हो

उदाहरण

यदि इनपुट स्ट्रिंग "10111000001011" है, तो उत्तर 12 इस प्रकार होगा -

  • पहला खंड 7 10111000001011 लंबाई का है
  • दूसरा खंड 5 10111000001011 लंबाई का है
  • कुल लंबाई किसकी लंबाई है (सेगमेंट 1 + सेगमेंट 2) =(7 + 5) =12

एल्गोरिदम

  • यदि प्रारंभ ==n तो 0 पर लौटें।
  • आरंभ से n तक एक लूप चलाएं, प्रत्येक उप-सरणी के लिए n तक की गणना करें।
  • यदि वर्ण 1 है तो 1 की संख्या बढ़ाएँ अन्यथा 0 की संख्या बढ़ाएँ।
  • यदि 1 की संख्या 0 से अधिक है, तो अनुक्रमणिका (k+1) यानी अगली अनुक्रमणिका के लिए फ़ंक्शन को दोबारा कॉल करें और शेष लंबाई यानी k-start+1 जोड़ें।
  • अन्यथा केवल अगली अनुक्रमणिका k+1 के लिए फ़ंक्शन को पुनरावर्ती रूप से कॉल करें।
  • रिटर्न डीपी[शुरू]।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int getSegmentWithMaxLength(int start, string str, int n, int dp[]) {
   if (start == n) {
      return 0;
   }
   if (dp[start] != -1) {
      return dp[start];
   }
   dp[start] = 0;
   int one = 0;
   int zero = 0;
   int k;
   for (k = start; k < n; ++k) {
      if (str[k] == '1') {
         ++one;
      } else {
         ++zero;
      } if (one > zero) {
         dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp) + k - start + 1);
      } else {
         dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp));
      }
   }
   return dp[start];
}
int main() {
   string str = "10111000001011";
   int n = str.size();
   int dp[n + 1];
   memset(dp, -1, sizeof(dp));
   cout << "Maximum length of segment = " << getSegmentWithMaxLength(0, str, n, dp) << endl;
   return 0;
}

आउटपुट

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

Maximum length of segment = 12

  1. C++ में k लंबाई की अधिकतम औसत उप-सरणी ज्ञात कीजिए

    इस समस्या में, हमें आकार n का एक सरणी arr[] दिया जाता है जिसमें धनात्मक और ऋणात्मक मान और एक पूर्णांक k होता है। हमारा कार्य k लंबाई की अधिकतम औसत उप-सरणी खोजना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट: गिरफ्तारी [] ={4, -1, 5, 6, -2, 4} k =3 आउटपुट: 10 स्पष्टीकरण: अधिकतम योग क

  1. C++ . में दीवारें और गेट

    मान लीजिए कि हमारे पास एक m x n 2D ग्रिड है, और यह इन तीन संभावित मानों के साथ आरंभ किया गया है। -1 दीवार या बाधा के लिए। 0 गेट के लिए। INF यह अनंत का अर्थ है एक खाली कमरा। यहाँ 2^31 - 1 =2147483647 INF है क्योंकि हम मान सकते हैं कि एक गेट की दूरी 2147483647 से कम है। प्रत्येक खाली कमरे

  1. C++ में वृत्त और आयत ओवरलैपिंग

    मान लीजिए कि हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) के रूप में दर्शाया गया है, यहाँ (xc, yc) वृत्त का केंद्र निर्देशांक है। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) के रूप में दर्शाया गया है, जहाँ (x1, y1) निचले-बाएँ कोने के निर्देशांक हैं, और (x2, y2) शीर्ष-दाएँ के निर्देशां