1235. 规划兼职工作

76 阅读1分钟

1235. 规划兼职工作

dp + 二分

误区:

  1. 没有对end进行排序,导致dp的过程中状态交叉
  2. 没有考虑清楚时间复杂度,应该考虑到logn是什么

收获:

  1. 对于一些dp而言并不只是递推的关系,还可以通过诸如二分的方法找到满足当前状态的最优,先预设状态再寻找
  2. 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];
    }
};