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

C++ में आकार K के M गैर-अतिव्यापी उप-सरणी का अधिकतम योग

समस्या कथन

एक सरणी और दो संख्या M और K को देखते हुए। हमें सरणी में K (गैर-अतिव्यापी) आकार के अधिकतम M उप-सरणी का योग खोजने की आवश्यकता है। (सरणी का क्रम अपरिवर्तित रहता है)। K सबअरे का आकार है और M सबअरे की गिनती है। यह माना जा सकता है कि सरणी का आकार m*k से अधिक है। यदि कुल सरणी आकार k का गुणज नहीं है, तो हम आंशिक अंतिम सरणी ले सकते हैं।

उदाहरण

यदि दिया गया सरणी ={2, 10, 7, 18, 5, 33, 0} है। एन =7, एम =3 और के =1 तो आउटपुट 61 होगा क्योंकि सबसेट है -

{33, 18, 10}

एल्गोरिदम

  • हम एक अनुमान सरणी बनाते हैं, जिसमें दिए गए सरणी में 'इंडेक्स' से 'इंडेक्स + के' तक सभी तत्वों के प्रत्येक इंडेक्स योग में शामिल होता है। और योग सरणी का आकार होगा n+1-k
  • अब अगर हम आकार k के सबअरे को शामिल करते हैं, तो हम उस सबएरे के किसी भी तत्व को फिर से किसी अन्य सबएरे में शामिल नहीं कर सकते क्योंकि यह ओवरलैपिंग सबएरे बनाएगा। इसलिए हम शामिल किए गए सबअरे के k तत्वों को छोड़कर रिकर्सिव कॉल करते हैं
  • अगर हम एक सबअरे को बाहर करते हैं तो हम उस सबएरे के अगले k-1 एलिमेंट को अन्य सबएरे में इस्तेमाल कर सकते हैं, इसलिए हम उस सबएरे के पहले एलिमेंट को छोड़कर रिकर्सिव कॉल करेंगे।
  • आखिरी बार अधिकतम (शामिल राशि, बहिष्कृत राशि) लौटाएं

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void calculatePresumArray(int presum[], int arr[], int n, int k) {
   for (int i = 0; i < k; i++) {
      presum[0] += arr[i];
   }
   for (int i = 1; i <= n - k; i++) {
      presum[i] += presum[i-1] + arr[i+k-1] - arr[i- 1];
   }
}
int maxSumMnonOverlappingSubarray(int presum[], int m, int size, int k, int start) {
   if (m == 0)
      return 0;
   if (start > size - 1)
      return 0;
   int mx = 0;
   int includeMax = presum[start] + maxSumMnonOverlappingSubarray(presum, m - 1, size, k, start + k);
   int excludeMax = maxSumMnonOverlappingSubarray(presum, m, size, k, start + 1);
   return max(includeMax, excludeMax);
}
int main() {
   int arr[] = { 2, 10, 7, 18, 5, 33, 0 };
   int n = sizeof(arr)/sizeof(arr[0]);
   int m = 3, k = 1;
   int presum[n + 1 - k] = { 0 };
   calculatePresumArray(presum, arr, n, k);
   cout << "Maximum sum = " << maxSumMnonOverlappingSubarray(presum, m, n + 1 - k, k, 0) << endl;
   return 0;
}

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

आउटपुट

Maximum sum = 61

  1. सी ++ में एक लाइन पर मैक्स पॉइंट्स

    मान लीजिए कि हमारे पास 2D प्लेन है। हमें एक ही सीधी रेखा पर रहने वाले बिंदुओं की अधिकतम संख्या ज्ञात करनी है। तो अगर अंक इस तरह हैं - फिर 4 अंक होते हैं इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - n :=अंकों की संख्या, यदि n <3 है, तो n लौटाएं उत्तर :=2 मैं के लिए 1 से n - 1 की सीमा

  1. C++ में दिए गए योग के साथ अधिकतम आकार का उपसमुच्चय

    समस्या कथन एन तत्वों और योग की एक सरणी को देखते हुए। हमें अधिकतम आकार के सबसेट का आकार खोजने की जरूरत है जिसका योग दिए गए योग के बराबर है उदाहरण यदि इनपुट सरणी arr ={ 2, 3, 5, 10} और योग =20 है तो आउटपुट 4 के रूप में होगा - 2 + 3 + 5 + 10 =20 जो दिए गए योग के बराबर है एल्गोरिदम हम इस समस्या को ह

  1. C++ में 0 योग के साथ सभी उप-सरणी मुद्रित करें

    इस समस्या में, हमें पूर्णांक मानों की एक सरणी दी जाती है और हमें इस सरणी से उन सभी उप-सरणी को प्रिंट करना होता है जिनका योग 0 के बराबर होता है। आइए विषय को बेहतर ढंग से समझने के लिए एक उदाहरण लेते हैं, Input: array = [-5, 0, 2, 3, -3, 4, -1] Output: Subarray with sum 0 is from 1 to 4. Subarray with