इस समस्या में, हमें n पूर्णांकों की एक सरणी arr[] दी गई है। हमारा कार्य एक प्रोग्राम बनाना है जो सरणी के पहले तत्व से शुरू होने वाले अधिकतम योग वैकल्पिक उपअनुक्रम को ढूंढे।
एक वैकल्पिक उपअनुक्रम वह उपअनुक्रम है जिसमें तत्व बारी-बारी से बढ़ते और घटते क्रम में होते हैं यानी पहले घटता है, फिर बढ़ता है, फिर घटता है। यहां, रिवर्स वैकल्पिक उपअनुक्रम अधिकतम योग ढूंढने के लिए मान्य नहीं है।
उदाहरण
इनपुट
arr[] = {5, 1, 6, 2, 4, 8, 9}
आउटपुट
27
व्याख्या
शुरुआती तत्व: 5, घटाव: 1, वृद्धि: 6, घटाव: 2, वृद्धि: 4, N.A. यहां, हम उपअनुक्रम के अंतिम तत्व के रूप में 4, 8, 9 का उपयोग कर सकते हैं। योग = 5 + 1 + 6 + 2 + 4 + 9 = 27
समाधान दृष्टिकोण
समस्या को हल करने के लिए, हम डायनामिक प्रोग्रामिंग दृष्टिकोण का उपयोग करेंगे। इसके लिए, हम दो सरणियों का उपयोग करेंगे: एक उन तत्वों के अधिकतम योग को संग्रहीत करने के लिए जो arr[i] के साथ समाप्त होते हैं, जहां arr[i] बढ़ रहा है। दूसरी उन तत्वों के अधिकतम योग को संग्रहीत करने के लिए जो arr[i] के साथ समाप्त होते हैं, जहां arr[i] घट रहा है।
फिर हम तत्वों को एक-एक करके जोड़ेंगे और जांचेंगे कि क्या वे वैकल्पिक उपअनुक्रम हैं। प्रत्येक सरणी के लिए, हम सूचकांक तक अधिकतम योग की गणना करेंगे। और n तत्वों को पार करने के बाद अधिकतम मान वापस करेंगे।
उदाहरण
हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,
#include<iostream>
#include<cstring>
using namespace std;
int maxVal(int x, int y){
if(x > y)
return x;
return y;
}
int calcMaxSumAltSubSeq(int arr[], int n) {
int maxSum = -10000;
int maxSumDec[n];
bool isInc = false;
memset(maxSumDec, 0, sizeof(maxSumDec));
int maxSumInc[n];
memset(maxSumInc, 0, sizeof(maxSumInc));
maxSumDec[0] = maxSumInc[0] = arr[0];
for (int i=1; i arr[i]) {
maxSumDec[i] = maxVal(maxSumDec[i],
maxSumInc[j]+arr[i]);
isInc = true;
}
else if (arr[j] < arr[i] && isInc)
maxSumInc[i] = maxVal(maxSumInc[i],
maxSumDec[j]+arr[i]);
}
}
for (int i = 0 ; i < n; i++)
maxSum = maxVal(maxSum, maxVal(maxSumInc[i], maxSumDec[i]));
return maxSum;
}
int main() {
int arr[]= {8, 2, 3, 5, 7, 9, 10};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"The maximum sum alternating subsequence starting is "<<calcMaxSumAltSubSeq(arr , n);
return 0;
}
आउटपुट
The maximum sum alternating subsequence starting is 25