ধরুন আমাদের কাছে পূর্ণসংখ্যার একটি অ্যারে সংখ্যা আছে, আমরা অ্যারেতে কিছু অপারেশন করতে পারি। এখানে প্রতিটি ক্রিয়াকলাপে, আমরা যেকোনো সংখ্যা[i] বাছাই করি এবং সংখ্যা[i] পয়েন্ট অর্জন করতে এটি মুছে ফেলি। আমাদের অবশ্যই nums[i] - 1 বা nums[i] + 1 এর সমান প্রতিটি উপাদান মুছে ফেলতে হবে। প্রাথমিকভাবে বিন্দু হল 0। এই ধরনের ক্রিয়াকলাপ প্রয়োগ করে আমাদের সর্বোচ্চ সংখ্যক পয়েন্ট অর্জন করতে হবে। সুতরাং যদি ইনপুটটি [3,4,2] এর মত হয়, তাহলে আউটপুট হবে 6। তাই এর কারণ, যদি আমরা 4 মুছে ফেলি, আমরা 4 পয়েন্ট পাব, ফলস্বরূপ 3টিও মুছে যাবে। তারপর 2 পয়েন্ট পেতে 2 মুছে দিন। মোট 6 পয়েন্ট অর্জিত হয়েছে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=সংখ্যা অ্যারের আকার, মানচিত্র m সংজ্ঞায়িত করুন, ret :=0, সংখ্যাগুলিতে উপাদানগুলির ফ্রিকোয়েন্সি m এ সঞ্চয় করুন
-
cnt :=0
-
প্রতিটি জোড়ার জন্য এটি m
-
x :=এর চাবি
-
temp :=x * এর মান
-
it1 :=এর আগের দিকে পয়েন্ট করুন এবং it2 :=it1 এর আগের দিকে পয়েন্ট করুন
-
যদি cnt>=1 এবং x – it1> 1 এর কী, তাহলে temp :=m[it1 এর কী]
-
অন্যথায় যখন cnt>=2, তারপর temp :=temp + m[it2 এর কী]
-
a =m[it1 এর কী] যদি cnt>=1, অন্যথায় 0
-
m[এর কী] :=সর্বোচ্চ তাপমাত্রা এবং a
-
ret :=ret এবং temp এর সর্বোচ্চ
-
cnt 1 দ্বারা বাড়ান
-
-
রিটার্ন রিটার্ন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
int n = nums.size();
map <int, int> m;
int ret = 0;
for(int i = 0; i < nums.size(); i++){
m[nums[i]]++;
}
int cnt = 0;
map <int, int> :: iterator it = m.begin();
while(it != m.end()){
int x = it->first;
int temp = x * it->second;
map <int, int> :: iterator it1 = prev(it);
map <int, int> :: iterator it2 = prev(it1);
if(cnt >= 1 && x - it1->first > 1){
temp += m[it1->first];
}
else if(cnt >= 2){
temp += m[it2->first];
}
m[it->first] = max(temp, cnt >= 1 ? m[it1->first] : 0);
ret = max(ret, temp);
it++;
cnt++;
}
return ret;
}
};
main(){
vector<int> v = {3,4,2};
Solution ob;
cout << (ob.deleteAndEarn(v));
} ইনপুট
[3,4,2]
আউটপুট
6