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

C++ में पूर्णांकों की एक सरणी को एक मान में मर्ज करने की लागत का पता लगाने के लिए कार्यक्रम

मान लीजिए कि हमें एक सरणी गिरफ्तारी दी गई है जिसमें n धनात्मक पूर्णांक संख्याएँ हैं। हमें एक पूर्णांक संख्या j भी दी गई है। हमें जो कार्य करना है, वह है j संख्याओं को जोड़कर उन्हें एक संख्या में मिला देना। विलय की लागत हमारे द्वारा चुनी गई j संख्याओं के योग के बराबर है। हमें इस मर्जिंग ऑपरेशन के लिए न्यूनतम संभव लागत का पता लगाना होगा।

इसलिए, यदि इनपुट arr =[2, 5, 6, 2, 3, 1, 3], j =4 जैसा है, तो आउटपुट 31 होगा।

2, 3, 1, 3 को मर्ज करने की लागत 2 + 3 + 1 + 3 =9 के बराबर है।

मर्ज ऑपरेशन के बाद का ऐरे [2, 5, 6, 9] बन जाता है। दूसरे मर्ज ऑपरेशन की लागत 2 + 5 + 6 + 9 =22 के बराबर है। इसलिए, मर्ज ऑपरेशन की कुल लागत 22 + 9 =31 हो जाती है। यह न्यूनतम विलय लागत है।

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

  • n :=गिरफ्तारी का आकार
  • यदि (n-1) mod (j-1) 0 के बराबर नहीं है, तो −
    • वापसी -1
  • एक सरणी अस्थायी परिभाषित करें(n + 1)
  • इनिशियलाइज़ करने के लिए i :=n-1, जब i>=0, अपडेट करें (i से 1 घटाएं), −
      करें
    • temp[i] :=arr[i] + temp[i + 1]
  • एक 2डी सरणी को परिभाषित करें dynArr क्रम n x n
    • इनिशियलाइज़ k :=j के लिए, जब k <=n, अपडेट करें (k को 1 से बढ़ाएँ), करें -
    • इनिशियलाइज़ le :=0, rg :=k-1 के लिए, जब rg
    • dynArr[le, rg] :=inf
    • इनिशियलाइज़ i :=le के लिए, जब i
    • dynArr[le, rg] :=न्यूनतम (dynArr[le, rg] और dynArr[le, i] + dynArr[i + 1, rg])
  • यदि (rg - le) mod (j-1) 0 के समान है, तो −
    • dynArr[le, rg] :=dynArr[le, rg] + temp[le] - temp[rg + 1]
  • रिटर्न dynArr[0, n - 1]
  • उदाहरण

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

    #include<bits/stdc++.h>
    using namespace std;
    int solve(vector<int>& arr, int j) {
       int n = arr.size();
       if ((n - 1) % (j - 1) != 0) return -1;
    
       vector<int> temp(n + 1);
       for (int i = n - 1; i >= 0; i--) {
          temp[i] = arr[i] + temp[i + 1];
       }
       vector<vector<int>> dynArr(n, vector<int>(n));
       for (int k = j; k <= n; k++) {
          for (int le = 0, rg = k - 1; rg < n; le++, rg++) {
             dynArr[le][rg] = INT_MAX;
             for (int i = le; i < rg; i += j - 1) {
                dynArr[le][rg] = min(dynArr[le][rg], dynArr[le][i] + dynArr[i + 1][rg]);
             }
             if ((rg - le) % (j - 1) == 0) {
                dynArr[le][rg] += temp[le] - temp[rg + 1];
             }
          }
       }
       return dynArr[0][n - 1];
    }
    
    int main() {
    vector<int> arr = {2, 5, 6, 2, 3, 1, 3};
    cout<< solve(arr, 4) <<endl;
    return 0;
    }

    इनपुट

    {2, 5, 6, 2, 3, 1, 3}, 4

    आउटपुट

    31

    1. C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

      मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं। कोने 1 से n तक गिने जाते हैं, और वे सरणी किनारों में दिए गए किनारों से जुड़े होते हैं। प्रत्येक शीर्ष का 1 से n तक की संख्या के भीतर x मान होता है जो कि सरणी मान में दिया जाता है। अब, हमें ग्राफ से अति शीर्षों का पता लगाना है। एक शीर्ष i को सु

    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++ प्रोग्राम एक ग्रिड में प्रबुद्ध कोशिकाओं की संख्या का पता लगाने के लिए

      मान लीजिए, हमें h * w आयामों का एक ग्रिड दिया गया है। ग्रिड में कोशिकाओं में या तो बल्ब या बाधाएं हो सकती हैं। एक लाइट बल्ब सेल स्वयं को और उसके दाएं, बाएं, ऊपर और नीचे की कोशिकाओं को रोशन करता है और प्रकाश कोशिकाओं के माध्यम से चमक सकता है जब तक कि कोई बाधा सेल प्रकाश को अवरुद्ध न करे। एक बाधा सेल