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

C++ में रिमूव बॉक्सेस समस्या


मान लीजिए हमारे पास अलग-अलग रंगों के कई बॉक्स हैं। ये रंग अलग-अलग पॉजिटिव नंबरों द्वारा दर्शाए गए हैं। हम कई राउंड्स में बॉक्सेस को तब तक हटा सकते हैं जब तक कोई बॉक्स न बचे। प्रत्येक राउंड में हम एक ही रंग के कुछ कंटीन्यूअस बॉक्सेस (k बॉक्सेस से बने, k ≥ 1) चुन सकते हैं, उन्हें हटा सकते हैं और k*k पॉइंट्स प्राप्त कर सकते हैं। यदि इनपुट [1,3,2,2,2,4,4,3,1] है, तो आउटपुट 21 होगा।

आपको प्राप्त होने वाले अधिकतम पॉइंट्स ढूंढने हैं।

समाधान दृष्टिकोण (डायनामिक प्रोग्रामिंग + मेमोइजेशन)

  1. solve() फंक्शन परिभाषित करें जो लेता है: boxes ऐरे, i, j, k, और एक 3D ऐरे dp।
  2. यदि i > j, तो 0 लौटाएं।
  3. यदि dp[i][j][k] != -1, तो dp[i][j][k] लौटाएं।
  4. ret := -INF।
  5. जब i+1 <= j और boxes[i+1] == boxes[i], i बढ़ाएं और k बढ़ाएं।
  6. ret := max(ret, (k+1)*(k+1) + solve(boxes, i+1, j, 0, dp))।
  7. x = i+1 से j तक लूप करें:
    • यदि boxes[x] == boxes[i]:
      • ret := max(ret, solve(boxes, i+1, x-1, 0, dp) + solve(boxes, x, j, k+1, dp))
  8. dp[i][j][k] = ret लौटाएं।
  9. मुख्य मेथड से:
    • n := boxes.size()
    • आकार (n+1) x (n+1) x (n+1) का 3D ऐरे dp परिभाषित करें, -1 से भरें।
    • solve(boxes, 0, n-1, 0, dp) लौटाएं।

C++ कार्यान्वयन

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

class Solution {
public:
    int solve(vector<int>& boxes, int i, int j, int k, 
              vector<vector<vector<int>>>& dp) {
        if (i > j) return 0;
        if (dp[i][j][k] != -1) return dp[i][j][k];
        
        int ret = INT_MIN;
        // समान रंग के लगातार बॉक्सेस को ग्रुप करें
        for (; i + 1 <= j && boxes[i + 1] == boxes[i]; i++, k++);
        
        // विकल्प 1: वर्तमान ग्रुप को अभी हटाएं
        ret = max(ret, (k + 1) * (k + 1) + solve(boxes, i + 1, j, 0, dp));
        
        // विकल्प 2: बाद में हटाने के लिए समान रंग के बॉक्स ढूंढें
        for (int x = i + 1; x <= j; x++) {
            if (boxes[x] == boxes[i]) {
                ret = max(ret, solve(boxes, i + 1, x - 1, 0, dp) + 
                          solve(boxes, x, j, k + 1, dp));
            }
        }
        return dp[i][j][k] = ret;
    }
    
    int removeBoxes(vector<int>& boxes) {
        int n = boxes.size();
        vector<vector<vector<int>>> dp(n + 1, 
            vector<vector<int>>(n + 1, vector<int>(n + 1, -1)));
        return solve(boxes, 0, n - 1, 0, dp);
    }
};

int main() {
    Solution ob;
    vector<int> v = {1, 3, 2, 2, 2, 4, 4, 3, 1};
    cout << ob.removeBoxes(v);
    return 0;
}

इनपुट

{1,3,2,2,2,4,4,3,1}

आउटपुट

21
  1. - C/C++ में remove फ़ंक्शन

    remove() फ़ंक्शन C लाइब्रेरी फ़ंक्शन int remove(const char *filename) दिए गए filename को डिलीट करता है ताकि यह अब एक्सेसिबल न रहे। डिक्लेरेशन int remove(const char *filename) पैरामीटर filename - डिलीट की जाने वाली फाइल का नाम रखने वाला C स्ट्रिंग रिटर्न वैल्यू सफलता पर: 0 एरर पर: -1, और errno

  1. - C++ में स्ट्रिंग से ट्रेलिंग जीरो हटाना

    इस प्रोग्राम में हम देखेंगे कि C++ में स्ट्रिंग से ट्रेलिंग जीरो कैसे हटाएं। कभी-कभी कुछ स्ट्रिंग में ट्रेलिंग जीरो हो सकते हैं जैसे 00023054। इस प्रोग्राम को 실행 करने के बाद, यह केवल 23054 लौटाएगा। प्रारंभिक जीरो हटा दिए जाते हैं। इनपुट: ट्रेलिंग जीरो वाली स्ट्रिंग 000023500124 आउटपुट: 23500124 एल

  1. - C++ में std::string से स्पेस हटाना

    इस प्रोग्राम में हम देखेंगे कि C++ में std::string से स्पेस कैसे हटाएं। इसे हटाने के लिए हम remove() फंक्शन का उपयोग करेंगे। इस remove() फंक्शन के साथ यह इटरेटर की शुरुआत और अंत लेता है, फिर तीसरा आर्गुमेंट लेता है जिसे उस इटरेटर ऑब्जेक्ट से हटाया जाएगा। इनपुट: एक स्ट्रिंग This is C++ Programming L