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

C++ में ऐरे का अधिकतम औसत योग पार्टीशन


समस्या कथन

एक ऐरे दिया गया है, हम संख्याओं की एक पंक्ति A को अधिकतम K आसन्न (गैर-खाली) समूहों में पार्टीशन करते हैं, फिर स्कोर प्रत्येक समूह के औसत का योग होता है। अधिकतम स्कोर क्या हो सकता है?

उदाहरण

यदि इनपुट ऐरे है {9, 2, 5, 3, 10} तो हम ऐरे को निम्नानुसार पार्टीशन कर सकते हैं:

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

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

एल्गोरिदम

हम इस समस्या को हल करने के लिए मेमोराइजेशन तकनीक का उपयोग कर सकते हैं:

  • मान लें memo[i][k] A[i से n-1] को अधिकतम K भागों में पार्टीशन करने का सर्वोत्तम स्कोर है।
  • पहले समूह में, हम A[i से n-1] को A[i से j-1] और A[j से n-1] में पार्टीशन करते हैं, तब हमारे उम्मीदवार पार्टीशन का स्कोर average(i, j) + score(j, k-1) होता है, जहां average(i, j) = (A[i] + A[i+1] + ... + A[j-1]) / (j - i)। हम इनमें से उच्चतम स्कोर लेते हैं।
  • कुल मिलाकर, सामान्य मामले में हमारा पुनरावर्तन है: memo[n][k] = max(memo[n][k], score(memo, i, A, k-1) + average(i, j))।

उदाहरण

#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. - C++ सम एरे पहेली (Sum Array Puzzle)

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

  1. - C++ में सम ऐरे पजल (बिना घटाव ऑपरेटर के)

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

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

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