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

C++ में बॉक्स हटाना (Remove Boxes)


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

अधिकतम अंक ज्ञात करें जो आप प्राप्त कर सकते हैं।

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

  • एक फंक्शन solve() परिभाषित करें, यह एक ऐरे boxes, i, j, k, एक 3D ऐरे dp लेगा,
  • यदि i > j, तो -
    • 0 वापस करें
  • यदि dp[i, j, k], -1 के बराबर नहीं है, तो -
    • dp[i, j, k] वापस करें
  • ret := -inf
  • शर्त i + 1 <= j और boxes[i + 1], boxes[i] के समान है की जांच के लिए, i बढ़ाते हुए, k बढ़ाते हुए, कुछ न करें -
  • ret := ret का अधिकतम और (k + 1) * (k + 1) + solve(boxes, i + 1, j, 0, dp) फंक्शन कॉल करें
  • x := i + 1 से प्रारंभ करें, जब x <= j, x बढ़ाते हुए, करें -
    • यदि boxes[x], boxes[i] के समान है, तो -
      • ret := ret का अधिकतम और solve(boxes, i + 1, x - 1, 0, dp) + solve(boxes, x, j, k + 1, dp)
  • dp[i, j, k] = ret वापस करें
  • मुख्य विधि से, निम्न करें
  • n := boxes का आकार
  • क्रम (n + 1) x (n + 1) x (n + 1) का एक 3D ऐरे dp परिभाषित करें, इसे -1 से भरें
  • solve(boxes, 0, n - 1, 0, dp) वापस करें

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

उदाहरण

#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++);       ret = max(ret, (k + 1) * (k + 1) + solve(boxes, i + 1, j, 0, dp));       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);    } }; main(){    Solution ob;    vector<int> v = {1,3,2,2,2,4,4,3,1};    cout << (ob.removeBoxes(v)); }

इनपुट

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

आउटपुट

21

  1. N × 3 ग्रिड को रंगने के तरीकों की संख्या - C++ प्रोग्राम N × 3 ग्रिड को रंगने के तरीकों की संख्या - C++ प्रोग्राम

    मान लीजिए हमारे पास एक ग्रिड है जिसका आकार n x 3 है और हम ग्रिड के प्रत्येक सेल को तीन रंगों में से ठीक एक से रंगना चाहते हैं। यहां उपयोग किए जाने वाले रंग लाल, पीला और हरा हैं।अब एक प्रतिबंध है, कि कोई दो आसन्न सेल एक ही रंग के नहीं हो सकते। हमारे पास ग्रिड की n संख्या में पंक्तियाँ हैं। अंत में, ह

  1. - C++ में एसोसिएटिव ऑपरेशन के साथ n तत्वों को गुणा करने के तरीके

    इस समस्या में, हमें एक पूर्णांक n दिया गया है जो तत्वों की संख्या है। हमारा कार्य एक ऐसा प्रोग्राम बनाना है जो n तत्वों को एसोसिएटिव ऑपरेशन के साथ गुणा करने के तरीकों की संख्या गिनता है। एसोसिएटिव ऑपरेशन संख्याओं की व्यवस्था के तरीके के बावजूद समान परिणाम लौटाते हैं। उदाहरण इनपुट 3 आउटपुट 12 व्याख्य

  1. C++ में N×3 ग्रिड को रंगने के तरीकों की संख्या C++ में N×3 ग्रिड को रंगने के तरीकों की संख्या

    समस्या विवरण मान लीजिए हमारे पास n x 3 आकार का एक ग्रिड है और हम ग्रिड के प्रत्येक सेल को तीन रंगों में से ठीक एक से रंगना चाहते हैं। रंग हैं लाल, पीला या हरा। अब एक प्रतिबंध है कि कोई भी दो आसन्न सेल का रंग समान नहीं होना चाहिए। हमारे पास n ग्रिड की पंक्तियों की संख्या है। हमें उन तरीकों की संख्या