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

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

मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी A है; हमें दो गैर-अतिव्यापी उपसरणियों में तत्वों का अधिकतम योग ज्ञात करना है। इन उपसरणियों की लंबाई एल और एम है।

तो अधिक सटीक रूप से हम कह सकते हैं कि, हमें सबसे बड़ा V खोजना होगा जिसके लिए

वी =(ए [i] + ए [i + 1] + ... + ए [i + एल -1]) + (ए [जे] + ए [जे + 1] + … + ए [जे + M-1]) और या तो -

  • 0 <=i

  • 0 <=j

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

  • n :=A का आकार

  • आकार n के बाएं एल सरणी को परिभाषित करें, आकार एन के बाएं एम सरणी को परिभाषित करें

  • आकार n के दाएं एल सरणी को परिभाषित करें, आकार n के दाएं सरणी को परिभाषित करें

  • रिट:=0, अस्थायी:=0

  • प्रारंभ करने के लिए i :=0, जब i

    • अस्थायी =अस्थायी + ए[i]

  • i :=L, j :=0 को इनिशियलाइज़ करने के लिए, जब i

    • leftL[i − 1] :=अधिकतम अस्थायी और x जहां x 0 है जब i − 2 <0 अन्यथा x =leftL[i − 2]

    • अस्थायी =अस्थायी + ए[i]

    • अस्थायी =अस्थायी - ए[जे]

  • leftL[n − 1] :=अधिकतम तापमान, और x जहां x 0 है, जब n − 2 <0 अन्यथा x :=leftL[n − 2]

  • अस्थायी:=0

  • प्रारंभ करने के लिए i :=0, जब i

    • अस्थायी =अस्थायी + ए[i]

  • i :=M, j :=0 को इनिशियलाइज़ करने के लिए, जब i

    • अस्थायी =अस्थायी + ए[i]

    • अस्थायी =अस्थायी - ए[जे]

  • leftM[n − 1] :=अधिकतम अस्थायी और x जब x :=0 यदि n - 2 <0 अन्यथा x :=leftM[n − 2]

  • अस्थायी:=0

  • i :=n − 1 को प्रारंभ करने के लिए, जब i> n − 1 − L, i को 1 से घटाएं -

    • अस्थायी =अस्थायी + ए[i]

  • i :=n − 1 - L, j :=n − 1 को इनिशियलाइज़ करने के लिए, जब i>=0, i को 1 से घटाएं, j को 1 से घटाएं -

    • राइट एल [i + 1]:=अधिकतम अस्थायी और x जहां x 0 है यदि i + 2> =n अन्यथा x =दायां एल [i + 2]

    • अस्थायी =अस्थायी + ए[i]

    • अस्थायी =अस्थायी - ए[जे]

  • दायां एल [0]:=अधिकतम तापमान और दायां एल [1]

  • अस्थायी:=0

  • i :=n − 1 को प्रारंभ करने के लिए, जब i> n − 1 − M, i को 1 से घटाएं -

    • अस्थायी =अस्थायी + ए[i]

  • i :=n − 1 − M, j :=n − 1 को इनिशियलाइज़ करने के लिए, जब i>=0, i को 1 से घटाएं, j को 1 से घटाएं -

    • दायां एम [i + 1]:=अधिकतम अस्थायी और एक्स, जहां एक्स 0 है जब i + 2> =n अन्यथा x:=दायां एम [i + 2]

    • अस्थायी =अस्थायी + ए[i]

    • अस्थायी =अस्थायी - ए[जे]

  • दायां एम [0]:=अधिकतम तापमान और दायां एम [1]

  • i :=L − 1 को इनिशियलाइज़ करने के लिए, जब i <=n - 1 - M, i को 1 से बढ़ाएँ -

    • रिट :=अधिकतम रिट और लेफ्टएल[i] + राइटएम[i + 1]

  • i :=M - 1 को इनिशियलाइज़ करने के लिए, जब i <=n - 1 - L, i को 1 से बढ़ाएँ -

    • रिट :=अधिकतम रिट और लेफ्टएम[i] + राइटएल[i + 1]

  • वापसी रिट

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxSumTwoNoOverlap(vector<int>& A, int L, int M) {
      int n = A.size();
      vector <int> leftL(n);
      vector <int> leftM(n);
      vector <int> rightL(n);
      vector <int> rightM(n);
      int ret = 0;
      int temp = 0;
      for(int i = 0; i < L; i++){
         temp += A[i];
      }
      for(int i = L, j = 0; i < n; i++, j++){
         leftL[i − 1] = max(temp, i − 2 < 0 ? 0 : leftL[i − 2]);
         temp += A[i];
         temp −= A[j];
      }
      leftL[n − 1] = max(temp, n − 2 < 0 ? 0 : leftL[n − 2]);
      temp = 0;
      for(int i = 0; i < M; i++){
         temp += A[i];
      }
      for(int i = M, j = 0; i < n; i++, j++){
         leftM[i − 1] = max(temp, i − 2 < 0 ? 0 : leftM[i − 2]);
         temp += A[i];
         temp −= A[j];
      }
      leftM[n − 1] = max(temp, n − 2 < 0 ? 0 : leftM[n − 2]);
      //out(leftM);
      temp = 0;
      for(int i = n − 1; i > n − 1 − L; i−−){
         temp += A[i];
      }
      for(int i = n − 1 − L, j = n − 1; i >= 0 ; i−−, j−− ){
         rightL[i + 1] = max(temp, (i + 2 >= n ? 0 : rightL[i + 2]));
         temp += A[i];
         temp −= A[j];
      }
      rightL[0] = max(temp, rightL[1]);
      temp = 0;
      for(int i = n − 1; i > n − 1 − M; i−−){
         temp += A[i];
      }
      for(int i = n − 1 − M, j = n − 1; i >= 0 ; i−−, j−− ){
         rightM[i + 1] = max(temp, (i + 2 >= n ? 0 : rightM[i + 2]));
         temp += A[i];
         temp −= A[j];
      }
      rightM[0] = max(temp, rightM[1]);
      for(int i = L − 1; i <= n − 1 − M; i++){
         ret = max(ret, leftL[i] + rightM[i + 1]);
      }
      for(int i = M − 1; i <= n − 1 − L; i++){
         ret = max(ret, leftM[i] + rightL[i + 1]);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v1 = {0,6,5,2,3,5,1,9,4};
   cout << (ob.maxSumTwoNoOverlap(v1, 1, 2));
}

इनपुट

[0,6,5,2,3,5,1,9,4]
1
2

आउटपुट

20

  1. C++ में सभी उपसरणियों के XOR का योग

    इस समस्या में, हमें n संख्याओं का एक सरणी arr[] दिया जाता है। हमारा कार्य सरणी के सभी उप-सरणी के XOR का योग ज्ञात करने के लिए एक प्रोग्राम बनाना है। यहां, हमें दिए गए सरणी के सभी उप-सरणी खोजने की आवश्यकता है, और फिर प्रत्येक उप-सरणी के लिए, हम तत्व का xor ढूंढेंगे और योग चर में XOR मान जोड़ेंगे। सम

  1. C++ में दो संख्या modulo M का योग

    इस समस्या में, हमें तीन संख्याएँ a, b, और M दी जाती हैं। हमारा कार्य दो संख्याओं modulo M का योग ज्ञात करने के लिए एक प्रोग्राम बनाना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, Input: a = 14 , b = 54, m = 7 Output: 5 Explanation: 14 + 54 = 68, 68 % 7 = 5 इस समस्या को हल करने के लिए, हम केवल संख्

  1. दो योग IV - इनपुट C++ में एक BST है

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री और एक लक्ष्य मान है; हमें यह जांचना होगा कि क्या बीएसटी में दो तत्व मौजूद हैं जैसे कि उनका योग दिए गए लक्ष्य के बराबर है या नहीं। तो, अगर इनपुट पसंद है तो आउटपुट ट्रू होगा। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - सरणी को परिभाषित करें v एक