डिवाइड एंड कॉन्कर एल्गोरिथ्म के द्वारा अधिकतम सबएरे योग (Maximum Sum Subarray) हासिल करें
n पूर्णांकों के अधिकतम सबएरे को खोजने के कई तरीके हैं। उन तरीकों में से एक डिवाइड एंड कॉन्कर एल्गोरिथ्म का उपयोग करना है। इस समस्या को हल करने के लिए, पूरे ऐरे को पुनरावृत्तिपूर्वक दो भागों में बाँटा जाता है। फिर प्रत्येक विभाजित हिस्से के लिए — बाएँ हिस्से, दाएँ हिस्से, और वह हिस्सा जो मिडपॉइंट (midpoint) को पार करता है — इन सबके लिए अधिकतम सबएरे की राशि का पता लगाया जाता है, और उनकी मदद से वर्तमान ऐरे के लिए सही उत्तर निकाला जाता है।
इस एल्गोरिथ्म का एक काल्पनिक (pseudocode) रूप नीचे दिया गया है:
def max_subarray(a):
# Base cases
if len(a) == 0:
return float('-inf'), float('-inf'), float('-inf')
if len(a) == 1:
return a[0], a[0], a[0]
# Divide (get answers for left and right parts)
ll, lmax, lr = max_subarray(a[:len(a) // 2])
rl, rmax, rr = max_subarray(a[len(a) // 2:])
lsum = sum(a[:len(a) // 2])
rsum = sum(a[len(a) // 2:])
# Obtain 3 numbers and return max-prefix, max-suffix, and total maximum sum
return conquer(ll, lmax, lr, lsum, rl, rmax, rr, rsum)
इस समस्या में, आपको conquer फ़ंक्शन को कार्यान्वित करना है, जहाँ आठ दिए गए मानों के आधार पर आपको सही तरह से तीन मान खोजने होते हैं: सर्वश्रेष्ठ प्रीफ़िक्स-सम (prefix sum), मिडपॉइंट को पार करने वाली सर्वश्रेष्ठ योग राशि, और सर्वश्रेष्ठ सफ़िक्स-सम (suffix sum)। ये आठ मान इस क्रम में दिए गए हैं:
बाएँ सबएरे का सर्वश्रेष्ठ प्रीफ़िक्स सम
बाएँ सबएरे की अधिकतम राशि
बाएँ सबएरे का सर्वश्रेष्ठ सफ़िक्स सम
बाएँ सबएरे की सभी संख्याओं का योग
दाएँ सबएरे का सर्वश्रेष्ठ प्रीफ़िक्स सम
दाएँ सबएरे की अधिकतम राशि
दाएँ सबएरे का सर्वश्रेष्ठ सफ़िक्स सम
दाएँ सबएरे की सभी संख्याओं का योग
इनपुट
इनपुट की एकमात्र पंक्ति में ऊपर बताए गए क्रम में 8 पूर्णांक होंगे। इन सभी पूर्णांकों का मान ± की सीमा के भीतर होगा।
आउटपुट
कार्यक्रम को 3 मान प्रिंट करने चाहिए — सर्वश्रेष्ठ प्रीफ़िक्स सम, मिडपॉइंट को पार करने वाला सर्वश्रेष्ठ योग, और सर्वश्रेष्ठ सफ़िक्स सम।