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

C++ में दिए गए स्ट्रिंग से k अद्वितीय परिणाम खोजने के बाद लागत का पता लगाने का कार्यक्रम

मान लीजिए, हमारे पास एक स्ट्रिंग s और दूसरा मान k है। हमें s के कुछ बाद के क्रमों का चयन करना होगा, ताकि हम k अद्वितीय अनुगामी प्राप्त कर सकें। यहां, बाद के चयन की लागत (ओं) की लंबाई (अनुक्रम) की लंबाई के बराबर होती है। इसलिए, हमें k अद्वितीय अनुक्रमों का चयन करने के बाद संभव न्यूनतम कुल लागत का पता लगाना होगा। यदि हम इस सेट का पता नहीं लगा पाते हैं, तो हम -1 पर लौट आएंगे। हम खाली स्ट्रिंग को एक मान्य बाद के रूप में मानेंगे।

इसलिए, यदि इनपुट s ="pqrs", k =4 जैसा है, तो आउटपुट 3 होगा।

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

  • n :=s का आकार

  • एक 2D सरणी dp आकार (n + 1) x (n + 1) परिभाषित करें और इसे 0

    से प्रारंभ करें
  • एक मानचित्र को अंतिम परिभाषित करें

  • डीपी [0, 0] :=1

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

    • डीपी [i + 1, 0]:=1

    • इनिशियलाइज़ j :=(i + 1) के लिए, जब j>=1, अपडेट करें (j को 1 से घटाएं), करें -

      • डीपी [i + 1, j]:=dp [i, j] + dp [i, j - 1]

    • यदि s[i] अंतिम का अंतिम तत्व नहीं है, तो -

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

        • डीपी [i + 1, j + 1] - =dp [अंतिम [s[i]], j]

    • अंतिम [एस [i]]:=मैं

  • लागत :=0

  • प्रारंभ करने के लिए i :=n, जब i>=0, अद्यतन करें (i से 1 घटाएं), करें -

    • वैल :=न्यूनतम k और dp[n, i]

    • लागत :=लागत + (वैल * (n - i))

    • के:=के - डीपी [एन, आई]

    • अगर के <=0, तो -

      • लूप से बाहर आएं

  • अगर के <=0, तो -

    • वापसी लागत

  • वापसी -1

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
int solve(string s, int k) {
   int n = s.size();
   vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
   unordered_map<char, int> last;
   dp[0][0] = 1;
   for (int i = 0; i < n; i++) {
      dp[i + 1][0] = 1;
      for (int j = (i + 1); j >= 1; j--) {
         dp[i + 1][j] = dp[i][j] + dp[i][j - 1];
      }
      if (last.find(s[i]) != last.end()) {
         for (int j = 0; j <= last[s[i]]; j++) {
            dp[i + 1][j + 1] -= dp[last[s[i]]][j];
         }
      }
      last[s[i]] = i;
   }
   int cost = 0;
   for (int i = n; i >= 0; i--) {
      int val = min(k, dp[n][i]);
      cost += (val * (n - i));
      k -= dp[n][i];
      if (k <= 0) {
         break;
      }
   }
   if (k <= 0) {
      return cost;
   }
   return -1;
}
int main(){
   cout << solve("pqrs",4) << endl;
   return 0;
}

इनपुट:

"pqrs", 4

आउटपुट

3

  1. q प्रश्नों के लिए दिए गए ग्राफ़ में न्यूनतम लागत पथ का पता लगाने के लिए C++ प्रोग्राम

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं और न्यूनतम रूप से जुड़ा हुआ है। किनारों को हमें एक सरणी दी जाती है जहां किनारों को {source, dest, weight} प्रारूप में दिया जाता है। अब, हमें प्रश्नों की q संख्या दी गई है जहां प्रत्येक क्वेरी {source, डेस्टिनेशन} प्रारूप की है। हमें स्रोत से गं

  1. दिए गए पूर्णांकों से अधिकतम संभव मिलान ज्ञात करने के लिए C++ प्रोग्राम

    मान लीजिए, हमें दो पूर्णांक n और m दिए गए हैं और पूर्णांकों के k टुपल्स हैं जिनमें चार पूर्णांक संख्याएँ {ai, bi, ci, di} हैं। चार सरणियाँ a, b, c, d दिए गए हैं, और a[i] i-th tuple के मान को दर्शाता है। अब, आइए एक अनुक्रम dp पर विचार करें जिसमें n धनात्मक पूर्णांक हैं और 1 <=dp[1]

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद