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

सी++ में ओन्स और जीरो

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

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

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

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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;
   }
};
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++ में वृत्त और आयत ओवरलैपिंग

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

  1. डोमिनोज़ और ट्रोमिनो टाइलिंग सी++ . में

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

  1. सी ++ और सी # में फ़ोरैच

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