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

C++ में एक और शून्य


मान लीजिए हमारे पास m 0s और n 1s का एक प्रभुत्व है। दूसरी ओर, बाइनरी स्ट्रिंग्स के साथ एक सरणी है। अब हमारा कार्य दिए गए m 0s और n 1s के साथ उत्पन्न होने वाली स्ट्रिंग्स की अधिकतम संख्या ढूंढना है। प्रत्येक 0 और 1 का उपयोग अधिकतम एक बार किया जा सकता है। इसलिए यदि इनपुट सरणी = ["10", "0001", "111001", "1", "0",] और m = 5 और n = 3 है, तो आउटपुट 4 होगा। ऐसा इसलिए है क्योंकि 5 0s और 3 1s के उपयोग से कुल 4 स्ट्रिंग्स बनाई जा सकती हैं, जो हैं "10", "0001", "1", "0"।

हल का दृष्टिकोण

इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  • आकार (m+1) x (n+1) की एक मैट्रिक्स बनाएं
  • ret := 0
  • i = 0 से strs सरणी का आकार तक:
    • one := 0, zero := 0
    • j = 0 से strs[i] का आकार तक:
      • जब strs[i][j] 1 हो तो one बढ़ाएं, या जब 0 हो तो zero बढ़ाएं
    • j = m से 0 तक नीचे:
      • k = n से one तक नीचे:
        • dp[j][k] := max(dp[j][k], 1 + dp[j-zero][k-one])
        • ret := max(ret, dp[j][k])
  • ret लौटाएं

उदाहरण

#include <bits/stdc++.h> 
using namespace std; 

class Solution { 
public: 
    int findMaxForm(vector<string>& strs, int m, int n) { 
        vector<vector<int>> dp(m + 1, vector<int>(n + 1)); 
        int ret = 0; 
        for(int i = 0; i < strs.size(); i++){ 
            int one = 0; 
            int zero = 0; 
            for(int j = 0; j < strs[i].size(); j++){ 
                one += strs[i][j] == '1'; 
                zero += strs[i][j] == '0'; 
            } 
            for(int j = m; j >= zero; j--){ 
                for(int k = n; k >= one; k--){ 
                    dp[j][k] = max(dp[j][k], 1 + dp[j - zero][k - one]); 
                    ret = max(ret, dp[j][k]); 
                } 
            } 
        } 
        return ret; 
    } 
}; 

int main(){ 
    vector<string> v = {"10","0001","111001","1","0"}; 
    Solution ob; 
    cout << (ob.findMaxForm(v, 5, 3)); 
}

इनपुट

["10","0001","111001","1","0"] 5 3

आउटपुट

4

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

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

  1. C++ में डोमिनो और ट्रोमिनो टाइलिंग C++ में डोमिनो और ट्रोमिनो टाइलिंग

    मान लीजिए हमारे पास दो प्रकार के आकार हैं, डोमिनो और ट्रोमिनो। उन्हें नीचे दिखाए अनुसार घुमाया जा सकता है:एक टाइलिंग में, प्रत्येक वर्ग को एक टाइल द्वारा कवर किया जाना चाहिए। यहां दो टाइलिंग तभी अलग हैं जब बोर्ड पर दो 4-दिशात्मक आसन्न सेल हों जैसे कि उन टाइलिंग में से केवल एक में दोनों वर्ग एक टाइल

  1. - C++ और C# में Foreach लूप

    C++ में Foreach लूप C++11 ने foreach लूप (रेंज-बेस्ड फॉर लूप) पेश किया जो कंटेनर के प्रत्येक एलिमेंट को ट्रैवर्स करता है। उदाहरण: #include <iostream> using namespace std; int main() { int myArr[] = { 99, 15, 67 }; // foreach लूप for (int ele : myArr) cout << ele << e