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

सी++ में मी से कम या उसके बराबर लंबाई की अधिकतम योग सरणी खोजें

समस्या में, हमें अलग-अलग लंबाई के n सरणियाँ दी गई हैं। हमारा काम मी से कम या उसके बराबर लंबाई की अधिकतम योग सरणी खोजना है।

योग को अधिकतम करने के लिए हमें सरणियों से उप-सरणी खोजने की आवश्यकता है और सभी उप-सरणी की लंबाई को m के बराबर बनाने की आवश्यकता है।

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

इनपुट

n = 3, m = 4
arrOfArr[][] = {
   {5, 2, -1, 4, -3}
   {3, -2, 1, 6}
   {-2, 0, 5}
}

आउटपुट

20

स्पष्टीकरण

SubArrays are {5, 4}, {6}, {5},
length = 2 + 1 + 1 = 4
Sum = 5 + 4 + 6 + 5 = 20
हैं।

समाधान दृष्टिकोण

गतिशील प्रोग्रामिंग दृष्टिकोण का उपयोग करके समस्या को हल किया जा सकता है। हम एक DP सरणी बनाएंगे और लंबाई k के संचयी सरणी योगों की गणना करेंगे जो 0 से m तक भिन्न होता है।

DP सरणी में, 2D DP में 0 से m foreach सरणी तक की सभी लंबाई के लिए अधिकतम सरणी योग संग्रहीत करें। फिर अधिकतम योग लौटाएं जो सरणी की अंतिम पंक्ति में होगा।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include <bits/stdc++.h>
using namespace std;
#define N 5
int findMax(int a, int b){
   if(a > b)
      return a;
      return b;
}
int findMaxSumArray(int arr[][N], int M) {
   int DP[N][M];
   int sumArray[M];
   int sum[M];
   memset(DP, -1, sizeof(DP[0][0]) * N * M);
   sumArray[0] = 0;
   DP[0][0] = 0;
   for (int i = 1; i <= 5; i++) {
      int len = arr[i - 1][0];
      for (int j = 1; j <= len; j++) {
         sumArray[j] = arr[i - 1][j];
         sumArray[j] += sumArray[j - 1];
         sum[j] = -100;
      }
      for (int j = 1; j <= len && j <= 6; j++)
         for (int k = 1; k <= len; k++)
            if (j + k - 1 <= len)
               sum[j] = findMax(sum[j], sumArray[j + k - 1] - sumArray[k - 1]);
         for (int j = 0; j <= 6; j++)
            DP[i][j] = DP[i - 1][j];
         for (int j = 1; j <= 6; j++)
            for (int cur = 1; cur <= j && cur <= len; cur++)
               DP[i][j] = findMax(DP[i][j], DP[i - 1][j - cur] + sum[cur]);
   }
   int maxSum = 0;
   for (int i = 0; i <= 6; i++)
      maxSum = findMax(maxSum, DP[5][i]);
      return maxSum;
}
int main() {
   int arr[][N] = { { 3, 2, -1, 6 },
   { 2, 7, -1 },
   { 3, 2, 2, -4 } };
   int m = 4;
   cout<<"Maximum sum array of length less than or equal to "<<m<<" : "<<findMaxSumArray(arr, m);
}

आउटपुट

Maximum sum array of length less than or equal to 4 : 15

  1. C++ में बाइनरी ट्री में अधिकतम लम्बवत योग ज्ञात कीजिए

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। कार्य ऊर्ध्वाधर क्रम ट्रैवर्सल में सभी नोड्स के अधिकतम योग को प्रिंट करना है। तो अगर पेड़ नीचे जैसा है - लंबवत क्रम ट्रैवर्सल इस प्रकार है - 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 यहां अधिकतम 12 है। दृष्टिकोण सरल है। हम वर्टिकल ऑर्डर ट्रैवर्सल करेंगे, फिर योग

  1. C++ में n से कम या उसके बराबर सभी भाज्य संख्याएँ ज्ञात कीजिए

    यहां हम देखेंगे कि n से कम या उसके बराबर सभी भाज्य संख्याओं को कैसे मुद्रित किया जाता है, एक संख्या N को भाज्य संख्या कहा जाता है यदि यह एक धनात्मक संख्या का भाज्य है। तो कुछ भाज्य संख्याएं 1, 2, 6, 24, 120 हैं। फैक्टोरियल नंबर प्रिंट करने के लिए, हमें सीधे फैक्टोरियल खोजने की जरूरत नहीं है। I =1 स

  1. सी++ में एक सरणी में अधिकतम जीसीडी के साथ जोड़ी खोजें

    मान लीजिए कि हमारे पास सकारात्मक पूर्णांकों की एक सरणी है। हमारा काम सरणी से पूर्णांकों की जोड़ी को खोजना है, जहां GCD मान अधिकतम है। मान लीजिए A ={1, 2, 3, 4, 5}, तो आउटपुट 2 है। जोड़ी (2, 4) में GCD 2 है, अन्य GCD मान 2 से कम हैं। इस समस्या को हल करने के लिए, हम प्रत्येक तत्व के भाजक की गिनती को