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

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


मान लीजिए हमें एक सरणी arr दी गई है जिसमें 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 := arr का आकार
  • यदि (n - 1) mod (j - 1) शून्य के बराबर नहीं है, तो -1 लौटाएं
  • आकार n+1 का एक सरणी temp परिभाषित करें
  • i := n-1 से 0 तक:
    • temp[i] := arr[i] + temp[i + 1]
  • आकार n x n का एक 2D सरणी dynArr परिभाषित करें
    • k := j से n तक:
      • le := 0, rg := k - 1 से शुरू करते हुए rg < n तक:
        • dynArr[le][rg] := INF
        • i := le से rg-1 तक, चरण j-1:
          • dynArr[le][rg] := min(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++ प्रोग्राम ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स वाला एक ग्राफ दिया गया है। वर्टेक्स 1 से n तक संख्याबद्ध हैं और edges सरणी में दी गई एज्स से जुड़े हैं। प्रत्येक वर्टेक्स का एक x मान है जो 1 से n के बीच होता है, यह values सरणी में दिया गया है। हमें ग्राफ में सुपर वर्टेक्स खोजने हैं। एक वर्टेक्स i को सुपर वर्टेक्स कहा जाता है

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

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

  1. ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम

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