समस्या कथन
एन पूर्णांकों की एक सरणी गिरफ्तारी [] को देखते हुए। कार्य पहले अधिकतम उप-सरणी योग को खोजना है और फिर उप-सरणी से अधिकतम एक तत्व को निकालना है। अधिकतम एक तत्व को ऐसे निकालें कि हटाने के बाद अधिकतम योग अधिकतम हो।
यदि दी गई इनपुट सरणी {1, 2, 3, -2, 3} है तो अधिकतम उप-सरणी योग {2, 3, -2, 3} है। तब हम -2 को हटा सकते हैं। शेष सरणी को हटाने के बाद बन जाता है-
{1, 2, 3, 3} with sum 9 which is maximum.
एल्गोरिदम
1. Use Kadane’s algorithm to find the maximum subarray sum. 2. Once the sum has beens find, re-apply Kadane’s algorithm to find the maximum sum again with some minor changes)
उदाहरण
#include <bits/stdc++.h> using namespace std; int getMaxSubarraySum(int *arr, int n){ int max = INT_MIN; int currentMax = 0; for (int i = 0; i < n; ++i) { currentMax = currentMax + arr[i]; if (max < currentMax) { max = currentMax; } if (currentMax < 0) { currentMax = 0; } } return max; } int getMaxSum(int *arr, int n){ int cnt = 0; int minVal = INT_MAX; int minSubarr = INT_MAX; int sum = getMaxSubarraySum(arr, n); int max = INT_MIN; int currentMax = 0; for (int i = 0; i < n; ++i) { currentMax = currentMax + arr[i]; ++cnt; minSubarr = min(arr[i], minSubarr); if (sum == currentMax) { if (cnt == 1) { minVal = min(minVal, 0); } else { minVal = min(minVal, minSubarr); } } if (currentMax < 0) { currentMax = 0; cnt = 0; minSubarr = INT_MAX; } } return sum - minVal; } int main(){ int arr[] = {1, 2, 3, -2, 3}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Maximum sum = " << getMaxSum(arr, n) << endl; return 0; }
आउटपुट
जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है-
Maximum sum = 9