1. Recursive Inclusion / Exclusion with Linear Scan
Intuition
Sort jobs by finish time and recursively evaluate include vs exclude with a linear scan for non-conflicting jobs.
Algorithm
- Sort jobs by finish time.
- Define
solve(i). - If
i < 0, return 0. - Exclude:
solve(i - 1). - Include: Find latest
j < iwithjobs[j].finish <= jobs[i].startvia linear scan. - Return
max(exclude, jobs[i].profit + solve(j)).
#include <iostream>#include <vector>#include <algorithm> using namespace std; struct Job { int start, finish, profit; }; class Solution { int solve(int i, const vector<Job>& jobs) { if (i < 0) return 0; int exclude = solve(i - 1, jobs); int latest = -1; for (int j = i - 1; j >= 0; --j) { if (jobs[j].finish <= jobs[i].start) { latest = j; break; } } int include = jobs[i].profit + solve(latest, jobs); return max(exclude, include); }public: int maxProfit(vector<vector<int>>& jobList) { int n = jobList.size(); vector<Job> jobs(n); for (int i = 0; i < n; ++i) jobs[i] = {jobList[i][0], jobList[i][1], jobList[i][2]}; sort(jobs.begin(), jobs.end(), [](const Job& a, const Job& b) { return a.finish < b.finish; }); return solve(n - 1, jobs); }}; int main() { Solution sol; vector<vector<int>> jobs = {{1, 2, 50}, {3, 5, 20}, {6, 19, 100}, {2, 100, 200}}; cout << "Max Profit: " << sol.maxProfit(jobs) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack