মান লিইয়ে নিই আমাদের কাছে বিভিন্ন রঙের কিছু বক্স রয়েছে। এই রঙগুলো ভিন্ন ধনাত্মক সংখ্যা দিয়ে রিপ্রেজেন্ট করা হয়েছে। আমরা অনেক রাউন্ড বক্স রিমুভ করতে পারি যতক্ষণ না কোনো বক্স থাকতে না থাকে। প্রতিটি রাউন্ডে আমরা একই রঙের কিছু সन्नিহিত বক্স বেছে নিতে পারি (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 1 বাড়ান), (k 1 বাড়ান), কিছুই করবেন না
- ret := ret এবং (k + 1) * (k + 1) + solve(boxes, i + 1, j, 0, dp)-এর সর্বোচ্চ
- x := i + 1 থেকে आरंभ করুন, когда x <= j, আপডেট করুন (x 1 বাড়ান), করুন:
- যদি boxes[x], boxes[i]-এর সমান হয়, তবে:
- ret := ret এবং solve((boxes, i + 1, x - 1, 0, dp) + solve(boxes, x, j, k + 1, dp))-এর সর্বোচ্চ
- যদি boxes[x], boxes[i]-এর সমান হয়, তবে:
- ফেরত দিন 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