1235. 规划兼职工作
dp + 二分
误区:
- 没有对end进行排序,导致dp的过程中状态交叉
- 没有考虑清楚时间复杂度,应该考虑到logn是什么
收获:
- 对于一些dp而言并不只是递推的关系,还可以通过诸如二分的方法找到满足当前状态的最优,先预设状态再寻找
- lower_cound and upper_bound
代码:
class Solution {
public:
int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
int n = startTime.size();
vector<vector<int>> jobs(n);
for (int i = 0; i < n; ++i) jobs[i] = {startTime[i], endTime[i], profit[i]};
sort(jobs.begin(), jobs.end(), [](const vector<int> &j1, const vector<int> &j2) -> bool { return j1[1] < j2[1]; });
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i) {
int j = upper_bound(jobs.begin(), jobs.begin() + i - 1, jobs[i - 1][0], [&](int val, const vector<int> &ele) -> bool { return val < ele[1]; }) - jobs.begin();
dp[i] = max(dp[i - 1], dp[j] + jobs[i - 1][2]);
}
return dp[n];
}
};