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

C++ में किसी सरणी का अधिकतम औसत योग विभाजन

समस्या कथन

एक सरणी को देखते हुए, हम संख्या A की एक पंक्ति को अधिकतम K आसन्न (गैर-रिक्त) समूहों में विभाजित करते हैं, फिर स्कोर प्रत्येक समूह के औसत का योग होता है। अधिकतम स्कोर क्या हो सकता है?

उदाहरण

यदि इनपुट सरणी {9, 2, 5, 3, 10} है तो हम सरणी को इस प्रकार विभाजित कर सकते हैं -

{9} {2, 5, 3} और {10} तो इसका औसत योग है -

9 + (2 + 5 + 3)/3 + 10 =22.33

एल्गोरिदम

हम इस समस्या को हल करने के लिए याद रखने की तकनीक का उपयोग कर सकते हैं -

  • अधिकतम K भागों में A[i से n-1] को विभाजित करते हुए मेमो[i][k] सर्वश्रेष्ठ स्कोर होने दें
  • पहले समूह में, हम A[i से n-1] को A[i से j-1] और A[j से n-1] में विभाजित करते हैं, फिर हमारे उम्मीदवार विभाजन में स्कोर औसत (i, j) + स्कोर (जे, के -1)), जहां औसत (आई, जे) =(ए [i] + ए [i + 1] + … + ए [जे -1]) / (जे - आई)। हम इनमें से उच्चतम स्कोर लेते हैं
  • कुल मिलाकर, सामान्य स्थिति में हमारा रिकर्सन है:मेमो [एन] [के] =अधिकतम (मेमो [एन] [के], स्कोर (मेमो, आई, ए, के -1) + औसत (आई, जे ))

उदाहरण

आइए अब एक उदाहरण देखें -

#include <bits/stdc++.h>
using namespace std;
define MAX 1000
double memo[MAX][MAX];
double score(int n, vector<int>& arr, int k) {
   if (memo[n][k] > 0) {
      return memo[n][k];
   }
   double sum = 0;
   for (int i = n - 1; i > 0; i--) {
      sum += arr[i];
      memo[n][k] = max(memo[n][k], score(i, arr, k - 1) + sum / (n - i));
   }
   return memo[n][k];
}
double getLargestSum(vector<int>& arr, int K) {
   int n = arr.size();
   double sum = 0;
   memset(memo, 0.0, sizeof(memo));
   for (int i = 0; i < n; i++) {
      sum += arr[i];
      memo[i + 1][1] = sum / (i + 1);
   }
   return score(n, arr, K);
}
int main() {
   vector<int> arr = {9, 2, 5, 3, 10}; int K = 3;
   cout << "Largest sum = " << getLargestSum(arr, K) << endl;
   return 0;
}

आउटपुट

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

Largest sum = 22.3333

  1. सी++ सम ऐरे पहेली

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

  1. सी ++ में एक सम ऐरे पहेली?

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

  1. पायथन में अधिकतम योग के लिए विभाजन सरणी

    मान लीजिए कि हमारे पास एक पूर्णांक सरणी ए है, हमें सरणी को अधिकतम के (सन्निहित) लंबाई के उप-सरणी में विभाजित करना होगा। विभाजन के बाद, प्रत्येक उप-सरणी का मान उस उप-सरणी का अधिकतम मान बनने के लिए बदल जाता है। हमें विभाजन के बाद दिए गए सरणी का सबसे बड़ा योग ज्ञात करना है। तो अगर इनपुट [1, 15, 7, 9, 2