मान लीजिए कि हमारे पास अलग-अलग रंगों के कई बॉक्स हैं, इन रंगों को अलग-अलग सकारात्मक संख्याओं द्वारा दर्शाया गया है। हम बक्से को हटाने के लिए कई दौर का अनुभव कर सकते हैं जब तक कि कोई बॉक्स न बचा हो। प्रत्येक दौर में हम एक ही रंग के कुछ निरंतर बक्से चुन सकते हैं (के बक्से, के> =1 से बना), और उन्हें हटा दें और के * के अंक प्राप्त करें। तो अगर इनपुट इस तरह है - [1,3,2,2,2,4,4,3,1], तो आउटपुट 21 होगा।
अधिकतम अंक प्राप्त करें जो आप प्राप्त कर सकते हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन को हल करें () को परिभाषित करें, यह एक सरणी बॉक्स लेगा, i, j, k, एक 3D सरणी dp,
- यदि i> j, तो −
- वापसी 0
- यदि dp[i, j, k] -1 के बराबर नहीं है, तो −
- रिटर्न डीपी[i, j, k]
- सेवानिवृत्त:=-इन्फ़
- स्थिति की जांच करने के लिए i + 1 <=j और बॉक्स[i + 1] बॉक्स के समान है[i], अपडेट करें (i से 1 बढ़ाएं), (1 से k बढ़ाएं), कुछ न करें -
- ret :=अधिकतम रिट और (k + 1) * (k + 1) + फ़ंक्शन को कॉल करें हल करें (बॉक्स, i + 1, j, 0, dp)
- इनिशियलाइज़ x :=i + 1 के लिए, जब x <=j, अपडेट करें (x को 1 से बढ़ाएँ), −
- करें
- यदि बॉक्स[x], बक्सों के समान है[i], तो −
- ret:=अधिकतम रिट और सॉल्व ((बॉक्स, i + 1, x - 1, 0, dp) + सॉल्व (बॉक्स, x, j, k + 1, dp))
- यदि बॉक्स[x], बक्सों के समान है[i], तो −
- रिटर्न डीपी[i, j, k] =ret
- मुख्य विधि से, निम्न कार्य करें
- n :=बक्सों का आकार
- एक 3D सरणी dp को क्रम में परिभाषित करें (n + 1) x (n + 1) x (n + 1), इसे -1 से भरें
- रिटर्न सॉल्व (बॉक्स, 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