สมมติว่าเรามีอาร์เรย์ที่องค์ประกอบ ith คือราคาของหุ้นที่กำหนดในวันที่ i เราต้องออกแบบอัลกอริทึมเพื่อหากำไรสูงสุด เราอาจทำธุรกรรมได้มากเท่าที่เราต้องการ (ดังนั้น ซื้อหนึ่งหุ้นและขายหุ้นหนึ่งหุ้นหลายๆ ครั้ง) แต่เราต้องปฏิบัติตามกฎเหล่านี้ –
- เราไม่สามารถทำธุรกรรมหลายรายการพร้อมกันได้ (ดังนั้น เราต้องขายหุ้นก่อนที่คุณจะซื้ออีกครั้ง)
- หลังจากที่เราขายหุ้นของเราแล้ว เราไม่สามารถซื้อหุ้นได้ในวันถัดไป (ใจเย็นๆ 1 วัน)
หากอินพุตเป็นเหมือน [1,2,3,0,2] ผลลัพธ์จะเป็น 3 ลำดับก็เหมือน [ซื้อ, ขาย, คูลดาวน์, ซื้อ, ขาย]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- endWithSell :=0, endWithBuy :=-ve infinity, prevBuy :=0 และ prevSell :=0
- สำหรับ i :=0 ถึงขนาดของอาร์เรย์ที่กำหนด
- prevBuy :=endWithBuy
- endWithBuy :=สูงสุดของ endWithBuy และ prevSell – Arr[i]
- prevSell :=endWithSell
- endWithSell :=สูงสุดของ endWithSell และ prevBuy + Arr[i]
- ผลตอบแทน endWithSell
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxProfit(vector<int>& p) { int endWithSell = 0; int endWithBuy = INT_MIN; int prevBuy =0, prevSell = 0; for(int i =0;i<p.size();i++){ prevBuy = endWithBuy; endWithBuy = max(endWithBuy,prevSell - p[i]); prevSell = endWithSell; endWithSell = max(endWithSell, prevBuy + p[i]); } return endWithSell; } }; main(){ Solution ob; vector<int> v = {1,2,3,0,2}; cout << (ob.maxProfit(v)); }
อินพุต
[1,2,3,0,2]
ผลลัพธ์
3