समस्या कथन
एक ऐरे दिया गया है, हम संख्याओं की एक पंक्ति 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