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

C++ में सरणी विभाजन का सबसे बड़ा योग


मान लीजिए हमारे पास धनात्मक पूर्णांकों की एक सरणी और एक मान m है। हम इस सरणी को m संख्या के सन्निकट उपसरणियों में विभाजित कर सकते हैं। हमें इन m उपसरणियों में सबसे बड़े योग को न्यूनतम करने के लिए एक एल्गोरिदम तैयार करना है।

तो यदि सरणी [7,2,4,10,9] है, और m = 2, तो योग 19 होगा, क्योंकि हम दो उपसरणियां बना सकते हैं जैसे [7,2,4] और [10,9], फिर सबसे बड़े योग वाली उपसरणी 19 है।

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

  • एक फ़ंक्शन splitArray() परिभाषित करें, जो एक सरणी v, m लेगा,
  • n := v का आकार
  • आकार n की एक सरणी dp बनाएं
  • आकार n की एक और सरणी sum बनाएं
  • sum[0] := v[0]
  • i := 1 से आरंभ करें, जब i < n, अपडेट करें (i को 1 से बढ़ाएं), करें -
    • sum[i] := sum[i - 1] + v[i]
  • dp[0] := sum[n - 1]
  • i := 1 से आरंभ करें, जब i < n, अपडेट करें (i को 1 से बढ़ाएं), करें -
    • dp[i] := sum[n - 1] - sum[i - 1]
  • i := 1 से आरंभ करें, जब i < m, अपडेट करें (i को 1 से बढ़ाएं), करें -
    • start := 0 से आरंभ करें, जब start < n - i, अपडेट करें (start को 1 से बढ़ाएं), करें -
      • end := start + 1 से आरंभ करें, जब end <= n - i, अपडेट करें (end को 1 से बढ़ाएं), करें -
      • dp[start] := dp[start] और अधिकतम का न्यूनतम (start 0 है तो sum[end - 1], अन्यथा sum[end - 1] - sum[start - 1]) और dp[end]
  • dp[0] लौटाएं

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

उदाहरण

#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public:    int splitArray(vector<int>& v, int m) {       int n = v.size();       vector <long long int > dp(n);       vector <long long int> sum(n);       sum[0] = v[0];       for(int i =1;i<n;i++)sum[i] =sum[i-1]+v[i];       dp[0] = sum[n-1];       for(int i =1;i<n;i++){          dp[i] = sum[n-1] - sum[i-1];       }       for(int i =1;i<m;i++){          for(int start = 0;start<n-i;start++){             for(int end = start+1;end<=n-i;end++){                dp[start] = min(dp[start],max((start==0?sum[end-1]:sum[end-1]-sum[start-1]),dp[end]));             }          }       }       return dp[0];    } }; main(){    Solution ob;    vector<int> v = {7,2,4,10,9};    cout << (ob.splitArray(v, 2)); }

इनपुट

[7,2,4,10,9] 2

आउटपुट

19

  1. - C++ STL में सरणी का योग (Array Sum)

    सरणी योग ज्ञात करने के तरीके 1. शास्त्रीय विधि (लूप) सभी तत्वों पर पुनरावृति करके योग निकालें। int arr[] = {2, 5, 7, 8, 2, 6, 9}; int n = 7, sum = 0; for (int i = 0; i < n; i++) sum += arr[i]; // Output: 39 2. accumulate() फंक्शन ( हेडर) STL का बिल्ट-इन फंक्शन। #include <numeric> int su

  1. - C++ सम एरे पहेली (Sum Array Puzzle)

    एरे (Array) एक डेटा संरचना है जो समान डेटा प्रकार के कई तत्वों को संग्रहीत करती है। यह एक बार में मानों का पूरा सेट संग्रहीत कर सकता है। लेकिन इसकी लंबाई पहले से परिभाषित होनी चाहिए। इस सम एरे पहेली में, हमें एक निश्चित आकार का एरे A1 दिया जाता है, मान लीजिए n। इस पहेली को हल करने के लिए, हम S1 नाम

  1. - C++ में सम ऐरे पजल (बिना घटाव ऑपरेटर के)

    यहां हम ऐरे से संबंधित एक रोचक समस्या देखेंगे। n तत्वों वाला एक ऐरे है। हमें n तत्वों का एक और ऐरे बनाना है। लेकिन दूसरे ऐरे का i-th स्थान पहले ऐरे के i-th तत्व को छोड़कर सभी तत्वों का योग रखेगा। और एक प्रतिबंध है कि हम इस समस्या में घटाव ऑपरेटर का उपयोग नहीं कर सकते। यदि हम घटाव ऑपरेशन का उपयोग कर