इस समस्या में, हमें एक सरणी stkprice[] दी गई है जो i-वें दिन एक निश्चित स्टॉक की कीमत को दर्शाती है। हमारा कार्य C++ में स्टॉक्स खरीदने और बेचने के बाद अधिकतम लाभ की गणना करने के लिए एक प्रोग्राम बनाना है।
समस्या विवरण - यहां, हमें जांचना होगा कि लाभ प्राप्त करने के लिए स्टॉक कब खरीदा और बेचा जा सकता है। लाभ प्राप्त करने के लिए, हमें स्टॉक को कम कीमत पर खरीदना होगा और जब कीमत बढ़ जाए तो बेचना होगा। और जब भी गिरावट आए तो वही प्रक्रिया दोहरानी होगी।
आइए एक उदाहरण से समस्या को समझते हैं,
इनपुट
stkprice[] = {120, 310, 405, 210, 150, 550}
आउटपुट
685
व्याख्या
दिन 1 पर खरीदना और दिन 3 पर बेचना, 285 का लाभ देगा।
इसके बाद, दिन 5 पर खरीदना और दिन 6 पर बेचना, 400 का लाभ देगा।
यह कुल लाभ (400 + 285) = 685 बनाता है।
समाधान दृष्टिकोण
एक सरल समाधान खरीद-बिक्री चक्र के सभी संभावित संयोजनों की जांच करना होगा। वर्तमान दिन के लिए पहले दिन खरीदने से लेकर आखिरी दिन बेचने तक हर दिन से खरीद-बिक्री चक्र संयोजनों को आजमाएं। और उस चक्र को लें जो अधिकतम लाभ देता है।
हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,
उदाहरण
#include <iostream>
using namespace std;
int max(int a, int b){
if(a > b)
return a;
return b;
}
int MaximizeProfit(int stkPrice[], int firstDay, int lastDay){
if (lastDay <= firstDay)
return 0;
int maxProfit = 0;
for (int i = firstDay; i < lastDay; i++) {
for (int j = i + 1; j <= lastDay; j++) {
if (stkPrice[j] > stkPrice[i]) {
int profit = ( stkPrice[j] - stkPrice[i] ) + MaximizeProfit(stkPrice, firstDay, i - 1) + MaximizeProfit(stkPrice, j + 1, lastDay);
maxProfit = max(maxProfit, profit);
}
}
}
return maxProfit;
}
int main(){
int stkPrice[] = { 120, 310, 405, 210, 150, 550 };
int days = 6 ;
cout<<"The Maximum profit is "<<MaximizeProfit(stkPrice, 0, days);
return 0;
}
आउटपुट
The Maximum profit is 4196007
एक अधिक प्रभावी समाधान स्थानीय न्यूनतम और अधिकतम को व्यापार दिनों के लिए ढूंढकर प्रत्येक व्यापार के लिए अधिकतम लाभ ढूंढने पर आधारित है। स्थानीय न्यूनतम वे दिन हैं जहां स्टॉक की कीमत उसके पिछले और अगले दोनों दिनों से कम है। और अधिकतम न्यूनतम के विपरीत है। यदि कोई स्थानीय न्यूनतम नहीं है (इंडेक्स 0 से n-2 के भीतर), तो वे दिन लाभदायक नहीं हो सकते।
लाभ को अधिकतम करने के लिए, हम शेयर को स्थानीय न्यूनतम पर खरीदेंगे और इसे अगले स्थानीय अधिकतम पर बेचेंगे और न्यूनतम-अधिकतम जोड़ी के लिए भी ऐसा ही करेंगे। सभी न्यूनतम-अधिकतम लाभों को जोड़कर हमें maxProfit मिलेगा।
हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,
उदाहरण
#include <iostream>
using namespace std;
void MaximizeProfit(int price[], int n){
if (n == 1)
return;
int maxProfit = 0;
int i = 0;
while (i <= n - 1) {
while ((i <= n - 2) && (price[i + 1] <= price[i]))
i++;
int minima = i++;
while ((i < n) && (price[i] >= price[i - 1]))
i++;
int maxima = i - 1;
maxProfit += (price[maxima] - price[minima] );
// एक न्यूनतम-अधिकतम चक्र के लिए लाभ प्रदर्शित करने के लिए
// cout <<"Stock bought on day "<<(minima+ 1 )<<" and Sold
// on day "<<(maxima+1) <<" at a profit of "<<(price[maxima] - price[minima] )<<"\n";
}
cout<<"The maximized profit is "<<maxProfit;
}
int main(){
int stkPrice[] = { 120, 310, 405, 210, 150, 550 };
int days = 6;
MaximizeProfit(stkPrice, days);
return 0;
}
आउटपुट
The maximized profit is 685