मान लीजिए कि हमारे पास अलग-अलग कार्य हैं, जहां प्रत्येक कार्य प्रारंभ समय [i] से समाप्ति समय [i] तक किया जाना निर्धारित है, उस कार्य के लिए हमें लाभ का लाभ मिलता है [i]। हम स्टार्टटाइम, एंडटाइम और प्रॉफिट लिस्ट को जानते हैं, हमें अधिकतम लाभ का पता लगाना होगा जो हम इस तरह ले सकते हैं कि ओवरलैपिंग टाइम रेंज के साथ सबसेट में 2 कार्य न हों। यदि हम समय X पर समाप्त होने वाले कार्य को चुनते हैं तो हम समय X पर शुरू होने वाले अन्य कार्य को प्रारंभ करने में सक्षम होंगे।
इसलिए, यदि इनपुट स्टार्टटाइम =[1,2,3,3], एंडटाइम =[3,4,5,6] लाभ =[500,100,400,700]
जैसा है
तो आउटपुट 1200
. होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक डेटा को प्रारंभ, समाप्ति और लागत मानों के साथ परिभाषित करें
-
डेटा j की एक सरणी बनाएं
-
n :=s का आकार
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
एक डेटा अस्थायी बनाएं (s[i], e[i], p[i])
-
j के अंत में अस्थायी डालें
-
-
अंत समय के आधार पर सरणी j को क्रमबद्ध करें
-
n आकार की dp सरणी परिभाषित करें
-
डीपी [0] :=j[0].लागत
-
इनिशियलाइज़ i :=1 के लिए, जब i
-
अस्थायी:=0, निम्न:=0, उच्च:=i - 1
-
जबकि कम <उच्च, करें -
-
मध्य :=निम्न + (उच्च - निम्न + 1) / 2
-
अगर j[mid].end <=j[i].start, तो -
-
कम :=मध्य
-
-
अन्यथा
-
उच्च :=मध्य - 1
-
-
डीपी [i] :=j[i].लागत
-
अगर j[low].end <=j[i].start, तो -
-
डीपी [i]:=डीपी [i] + डीपी [कम]
-
-
-
dp[i] :=अधिकतम dp[i] और dp[i - 1]
-
-
वापसी डीपी [एन -1]
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; struct Data{ int s,e,c; Data(int x, int y, int z){ s= x; e= y; c = z; } }; bool cmp(Data a, Data b){ return a.e<b.e; } class Solution { public: int jobScheduling(vector<int>& s, vector<int>& e, vector<int>& p){ vector<Data> j; int n = s.size(); for (int i = 0; i < n; i++) { Data temp(s[i], e[i], p[i]); j.push_back(temp); } sort(j.begin(), j.end(), cmp); vector<int> dp(n); dp[0] = j[0].c; for (int i = 1; i < n; i++) { int temp = 0; int low = 0; int high = i - 1; while (low < high) { int mid = low + (high - low + 1) / 2; if (j[mid].e <= j[i].s) low = mid; else high = mid - 1; } dp[i] = j[i].c; if (j[low].e <= j[i].s) dp[i] += dp[low]; dp[i] = max(dp[i], dp[i - 1]); } return dp[n - 1]; } }; main(){ Solution ob; vector<int> startTime = {1,2,3,3}, endTime = {3,4,5,6}, profit = {500,100,400,700}; cout << (ob.jobScheduling(startTime, endTime, profit)); }
इनपुट
{1,2,3,3}, {3,4,5,6}, {500,100,400,700}
आउटपुट
1200