LeetCode - 1235. Maximum Profit in Job Scheduling
正常的dp用的都是数组然后以下标的形式表示每个位置的dp值,但是这里可以看出我们需要的下标值不是连续的,而是每个 Job 的 endTime,所以就想到用 mao 当做 dp 数组使用,就和正常的 dp 一样了。
把所有任务按照 endTime 进行排序,然后每次计算 dp[i] 的时候,先利用 std::upper_bound
函数找到第一个 endTime 比当前 startTime 大的 job,然后利用 std::prev
函数找到这个 job 的前一个 job,比如叫 i,那么 i 结束一定可以开始当前这个 job,更新 dp 值即可。
int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
const int N = startTime.size();
vector<vector<int>> jobs(N, vector<int>(3));
for(int i = 0; i < N; ++i) {
jobs[i][0] = endTime[i];
jobs[i][1] = startTime[i];
jobs[i][2] = profit[i];
}
sort(jobs.begin(), jobs.end());
map<int, int> dp; // dp[i] = k;表示以i为endTime, 最大profit为k
dp[0] = 0;
for(auto job : jobs) {
const int cur = prev(dp.upper_bound(job[1]))->second + job[2];
if (cur > dp.rbegin()->second)
dp[job[0]] = cur; // 否则不更新
}
return dp.rbegin()->second;
}