ধরুন আমাদের কাছে প্রতিটি অক্ষরের জন্য শব্দের একটি তালিকা, একক অক্ষরের একটি তালিকা এবং স্কোর রয়েছে। প্রদত্ত অক্ষর ব্যবহার করে গঠিত যেকোন বৈধ শব্দের সেটের সর্বোচ্চ স্কোর খুঁজে বের করতে হবে।
আমরা অক্ষরে সমস্ত অক্ষর ব্যবহার নাও করতে পারি এবং প্রতিটি অক্ষর শুধুমাত্র একবার ব্যবহার করা যেতে পারে। 'a', 'b', 'c', ... ,'z' অক্ষরের স্কোর যথাক্রমে স্কোর[0], স্কোর[1], ... , স্কোর[25] দ্বারা দেওয়া হয়।
সুতরাং, যদি ইনপুট শব্দের মত হয় =["গড", "গুড", "টক", "বিড়াল"], অক্ষর =[a,g,o,o,d,d,d,c,t,t] এবং স্কোর =[5,0,8,3,0,0,6,0,0,0,0,0,0,3,0,0,0,2,0,0,0, 0,0,0], তাহলে আউটপুট 30 হবে, এখানে ভাল এবং ক্যাট সর্বোচ্চ স্কোর করছে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি 2D অ্যারে ডিপি
সংজ্ঞায়িত করুন -
একটি ফাংশন calc() সংজ্ঞায়িত করুন, এটি s, একটি মানচিত্র m, একটি অ্যারে sc,
-
উত্তর :=0
-
আরম্ভ করার জন্য i :=0, যখন i
-
x :=s[i]
-
যদি m[x] <=0, তাহলে −
-
রিটার্ন 0
-
-
(1 দ্বারা m[x] হ্রাস করুন)
-
ans :=ans + sc[x - 'a']
-
-
উত্তর ফেরত দিন
-
একটি ফাংশন সল্ভ() সংজ্ঞায়িত করুন, এতে i, স্থিতি, জোড়ার একটি অ্যারে v, একটি মানচিত্র m, একটি অ্যারে s,
-
যদি আমি -1 এর মত হয়, তাহলে −
-
রিটার্ন 0
-
-
x :=v[i]
এর দ্বিতীয় মান -
উত্তর :=0
-
যদি স্থিতি 1 এর মত হয়, তাহলে −
-
উত্তর :=calc(x, m, s)
-
-
যদি উত্তর> 0 এবং স্থিতি 1 এর মত হয়, তাহলে −
-
j শুরু করার জন্য :=0, যখন j
করুন -
(m[x[j]] 1 দ্বারা হ্রাস করুন)
-
-
-
উত্তর + সর্বাধিক সমাধান (i - 1, 0, v, m, s) এবং সমাধান (i - 1, 1, v, m, s)
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
উত্তর :=0
-
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
আরম্ভ করার জন্য i :=0, যখন i
-
(m[l[i]] 1 দ্বারা বৃদ্ধি করুন)
-
-
জোড়ার একটি অ্যারে v সংজ্ঞায়িত করুন
-
আরম্ভ করার জন্য i :=0, যখন i
-
x :=w[i]
-
পতাকা :=calc(x, m, s)
-
যদি পতাকা অ-শূন্য হয়, তাহলে −
-
v
এর শেষে { পতাকা, x } সন্নিবেশ করুন
-
-
-
অ্যারে সাজান v
dp :=আকারের একটি 2D অ্যারে নির্ধারণ করুন (v এর আকার) x 2 এবং এটি -1 দিয়ে পূরণ করুন
সমাধানের সর্বোচ্চ (v, 0, v, m, s) এবং সমাধান (v, 1, v, m, s)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<vector<int> > dp; int calc(string s, map<char, int> m, vector<int>& sc){ int ans = 0; for (int i = 0; i < s.size(); i++) { char x = s[i]; if (m[x] <= 0) return 0; m[x]--; ans += sc[x - 'a']; } return ans; } int solve(int i, int status, vector<pair<int, string> > v, map<char, int> m, vector<int>& s){ if (i == -1) return 0; string x = v[i].second; int ans = 0; if (status == 1) ans = calc(x, m, s); if (ans > 0 && status == 1) { for (int j = 0; j < x.size(); j++) { m[x[j]]--; } } return ans + max(solve(i - 1, 0, v, m, s), solve(i - 1, 1, v, m, s)); } int maxScoreWords(vector<string>& w, vector<char>& l, vector<int>& s){ int ans = 0; map<char, int> m; for (int i = 0; i < l.size(); i++) m[l[i]]++; vector<pair<int, string> > v; for (int i = 0; i < w.size(); i++) { string x = w[i]; int flag = calc(x, m, s); if (flag) { v.push_back({ flag, x }); } } sort(v.begin(), v.end()); dp = vector<vector<int> >(v.size(), vector<int>(2, -1)); return max(solve(v.size() - 1, 0, v, m, s), solve(v.size() - 1, 1, v, m, s)); } }; main(){ Solution ob; vector<string> words = {"god", "good", "toc", "cat"}; vector<char> letters = {'a','g','o','o','d','d','d','c','t','t'}; vector<int> score = {5,0,8,3,0,0,6,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0}; cout << (ob.maxScoreWords(words, letters, score)); }
ইনপুট
{"god", "good", "toc", "cat"}, {'a','g','o','o','d','d','d','c','t','t'}, {5,0,8,3,0,0,6,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0}
আউটপুট
30