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

C++ में अक्षरों द्वारा निर्मित अधिकतम अंक शब्द

मान लीजिए कि हमारे पास शब्दों की एक सूची है, एकल अक्षरों की एक सूची है और प्रत्येक वर्ण के लिए अंक हैं। हमें दिए गए अक्षरों का उपयोग करके बनाए गए शब्दों के किसी भी मान्य सेट का अधिकतम अंक प्राप्त करना है।

हम अक्षरों में सभी वर्णों का उपयोग नहीं कर सकते हैं और प्रत्येक अक्षर का उपयोग केवल एक बार किया जा सकता है। 'ए', 'बी', 'सी', ..., 'जेड' अक्षरों का स्कोर क्रमशः स्कोर [0], स्कोर [1], ..., स्कोर [25] द्वारा दिया जाता है।

इसलिए, यदि इनपुट शब्दों की तरह है =["भगवान", "अच्छा", "टोक", "बिल्ली"], अक्षर =[ए, जी, ओ, ओ, डी, डी, डी, सी, टी, टी] और स्कोर =[5,0,8,3,0,0,0,6,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0, 0,0,0], तो आउटपुट 30 होगा, यहाँ अच्छा है और कैट अधिकतम स्कोर बना रहे हैं।

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

  • एक 2डी सरणी डीपी परिभाषित करें

  • एक फ़ंक्शन कैल्क () को परिभाषित करें, इसमें s, एक मैप m, एक सरणी sc,

    लगेगा
  • उत्तर:=0

  • इनिशियलाइज़ i:=0 के लिए, जब i <साइज़ ऑफ़ s, अपडेट (i से 1 तक बढ़ाएँ), करें -

    • एक्स:=एस [i]

    • अगर m[x] <=0, तो -

      • वापसी 0

    • (m[x] 1 से घटाएं)

    • उत्तर:=उत्तर + एससी [एक्स - 'ए']

  • वापसी उत्तर

  • फ़ंक्शन को हल करें () को परिभाषित करें, यह i, स्थिति, जोड़े की एक सरणी v, एक नक्शा m, एक सरणी s,

    लेगा।
  • अगर मैं -1 के समान हूं, तो -

    • वापसी 0

  • x :=.v[i] का दूसरा मान

  • उत्तर:=0

  • अगर स्थिति 1 के समान है, तो -

    • उत्तर:=कैल्क (एक्स, एम, एस)

  • अगर उत्तर> 0 और स्थिति 1 के समान है, तो -

    • इनिशियलाइज़ j :=0 के लिए, जब j

      • (m[x[j]] 1 से घटाएं)

  • उत्तर + अधिकतम हल करें (i - 1, 0, v, m, s) और हल करें (i - 1, 1, v, m, s)

  • मुख्य विधि से, निम्न कार्य करें -

  • उत्तर:=0

  • एक नक्शा परिभाषित करें मी

  • इनिशियलाइज़ i :=0 के लिए, जब i <का आकार l, अपडेट (i से 1 तक बढ़ाएँ), करें -

    • (m[l[i]] 1 से बढ़ाएं)

  • जोड़े की एक सरणी v परिभाषित करें

  • प्रारंभ करने के लिए i:=0, जब i

    • एक्स:=डब्ल्यू[i]

    • झंडा:=कैल्क (एक्स, एम, एस)

    • अगर झंडा गैर-शून्य है, तो -

      • 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

  1. C++ में शीर्ष K फ़्रीक्वेंट वर्ड्स

    मान लीजिए कि हमारे पास शब्दों की एक गैर-रिक्त सूची है; हमें k सबसे अधिक बार आने वाले तत्वों को खोजना होगा। हमारे उत्तर को आवृत्ति के अनुसार उच्चतम से निम्नतम तक क्रमबद्ध किया जाना चाहिए। जब दो शब्दों की बारंबारता समान हो तो निम्न वर्णक्रम वाले शब्द को पहले रखा जाएगा। तो यदि सरणी [द, आकाश, है, नीला,

  1. C++ में दो समूहों से गठित अधिकतम 3-व्यक्ति टीमों की संख्या

    इस समस्या में, हमें दो पूर्णांक N और M दिए गए हैं, N समूह 1 में लोगों की संख्या है और M समूह 2 में लोगों की संख्या है। हमारा कार्य बनाना है एक दो समूहों से गठित अधिकतम 3-व्यक्ति टीमों को खोजने का कार्यक्रम। हम इन समूहों में से एक व्यक्ति का चयन करके 3 लोगों की टीम तैयार करेंगे ताकि अधिक से अधिक टी

  1. C++ . में चतुर्भुज का अधिकतम क्षेत्रफल

    समस्या कथन चतुर्भुज a, b, c, d की चार भुजाओं को देखते हुए दी गई भुजाओं से चतुर्भुज का अधिकतम क्षेत्रफल ज्ञात कीजिए। एल्गोरिदम इस समस्या को हल करने के लिए हम नीचे ब्रह्मगुप्त के सूत्र का उपयोग कर सकते हैं - (s-a)(s-b)(s-c)(s-d) उपरोक्त सूत्र में s अर्ध-परिधि है। इसकी गणना इस प्रकार की जाती है -