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

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


समस्या कथन

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

उदाहरण

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

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

एल्गोरिदम

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

उदाहरण

#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 लंबाई का अधिकतम औसत उपसरणी ढूंढना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट: arr[] = {4, -1, 5, 6, -2, 4} k = 3 आउटपुट: 10 व्याख्या: आकार 3 का उपसरणी जिसका अधिकतम योग है

  1. - C++ में दीवारें और गेट - BFS से निकटतम गेट की दूरी

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

  1. C++ में वृत्त और आयत के ओवरलैप की जांच C++ में वृत्त और आयत के ओवरलैप की जांच

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