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

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


इस समस्या में, हमें धनात्मक पूर्णांकों की एक सरणी और एक संख्या k दी गई है। हमारा कार्य एक ऐसा प्रोग्राम बनाना है जो दिए गए आकार (के) के दो गैर-अतिव्यापी उप-सरणी का अधिकतम योग प्राप्त करेगा।

तो, मूल रूप से हमारे पास दो प्रिंट दो गैर-अतिव्यापी (विशिष्ट) उप-सरणी हैं जिनमें अधिकतम योग है और आकार k है।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट -

array = {7, 1, 6, 9, 2} , k = 2

आउटपुट -

{7, 1} , {6, 9}

स्पष्टीकरण -

all subarrays of size 2.
{7, 1} : sum = 7+1 = 8
{1, 6} : sum = 1+6 = 7
{6, 9} : sum = 6+9 = 15
{9, 2} : sum = 9+2 = 11
Two non-overlapping subarrays with max sums are {7,1} and {6,9}

इस समस्या को हल करने के लिए, एक सरल उपाय यह होगा कि सभी उपसरणियों और उनके योगों का पता लगाया जाए और फिर दो अधिकतम उपसरणियों की जाँच की जाए जो एक दूसरे को ओवरलैप नहीं करते हैं।

समस्या को हल करने के लिए एक प्रभावी तरीका उपसर्ग योग सरणी का उपयोग करना होगा जो सरणी के तत्व तक सभी तत्वों का योग संग्रहीत करता है। और अधिकतम योग के साथ उप-सरणी को खोजने के लिए k तत्वों की जाँच करें।

उदाहरण

हमारे समाधान के कार्यान्वयन को दिखाने के लिए कार्यक्रम,

#include <bits/stdc++.h>
using namespace std;
int findSubArraySum(int sum[], int i, int j){
   if (i == 0)
      return sum[j];
   else
      return (sum[j] - sum[i - 1]);
}
void maxSubarray(int arr[],int N, int K){
   int prefixsum[N];
   prefixsum[0] = arr[0];
   for (int i = 1; i < N; i++)
   prefixsum[i] = prefixsum[i - 1] + arr[i];
   pair<int, int> resIndex = make_pair(N - 2 * K, N - K);
   int maxSubarraySum = findSubArraySum(prefixsum, N - 2 * K, N - K - 1) + findSubArraySum(prefixsum, N - K, N - 1);
   pair<int, int> secondSubarrayMax = make_pair(N - K, findSubArraySum(prefixsum, N - K, N - 1));
   for (int i = N - 2 * K - 1; i >= 0; i--){
      int cur = findSubArraySum(prefixsum, i + K, i + 2 * K - 1);
      if (cur >= secondSubarrayMax.second)
         secondSubarrayMax = make_pair(i + K, cur);
      cur = findSubArraySum(prefixsum, i, i + K - 1) + secondSubarrayMax.second;
      if (cur >= maxSubarraySum){
         maxSubarraySum = cur;
         resIndex = make_pair(i, secondSubarrayMax.first);
      }
   }
   cout<<"{ ";
   for (int i = resIndex.first; i <resIndex.first + K; i++)
      cout<<arr[i]<<" ";
   cout<<"}"<<endl<<"{ ";
   for (int i = resIndex.second; i < resIndex.second + K; i++)
      cout<<arr[i]<<" ";
   cout<<"}"<<endl;
}
int main(){
   int arr[] = {2, 5, 1, 2, 7, 3, 0};
   int N = sizeof(arr) / sizeof(int);
   int K = 2;
   cout<<"Two non-overlapping subarrays with maximum sum are \n";
   maxSubarray(arr, N, K);
   return 0;
}

आउटपुट

Two non-overlapping subarrays with maximum sum are
{ 2 5 }
{ 7 3 }

  1. सी ++ में दो अलग-अलग सरणी के उप-सरणी का अधिकतम या योग

    समस्या कथन धनात्मक पूर्णांकों के दो सरणियों को देखते हुए। प्रत्येक सरणी से समान आकार के दो उप-सरणी चुनें और अधिकतम संभव या दो उप-सरणी के योग की गणना करें। उदाहरण अगर arr1[] ={1, 2, 4, 3, 2} और Arr2[] ={1, 3, 3, 12, 2} तब अधिकतम परिणाम प्राप्त होता है जब हम निम्नलिखित दो उप-सरणी बनाते हैं - Subar

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

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

  1. अधिकतम आकार 2 का न्यूनतम विभाजन और C++ में दिए गए मान द्वारा सीमित योग

    समस्या कथन सकारात्मक संख्याओं की एक सरणी गिरफ्तारी [] को देखते हुए, सरणी में सेटों की न्यूनतम संख्या ज्ञात करें जो निम्नलिखित संपत्ति को संतुष्ट करते हैं, एक समुच्चय में अधिकतम दो अवयव हो सकते हैं। दो तत्वों को सन्निहित होने की आवश्यकता नहीं है। सेट के तत्वों का योग दी गई कुंजी से कम या उसके बराबर