LeetCode 1235 规划兼职工作[动态规划 二分查找] HERODING的LeetCode之路

LeetCode 1235 规划兼职工作[动态规划 二分查找] HERODING的LeetCode之路_第1张图片
解题思路:
一道非常实用的动态规划题型,首先将时间信息、利润放入同一数组中,数组中每一项就代表每份工作的三个属性,按照结束时间对数组进行排序,同时也对结束数组进行从小到大排序,这里为什么不按照开始时间进行排序呢?因为按照结束时间,我能保证当前遍历的工作时,之前的工作都已经结束了,至于能不能兼职,再判断就好了, 但是按照开始时间,不能保证之前工作是否结束,到头来还是要拿前一个工作结束时间和当前工作开始时间比较,得不偿失。接着定义dp数组,dp[i]表示前i份工作最大利润,按照结束顺序遍历n个工作,找当前工作之前满足end条件的工作,这里用二分查找更加方便,用dp[i] = max(dp[i - 1], dp[t] + p);更新dp数组,最后返回dp[n],代码如下:

class Solution {
public:
    int jobScheduling(vector<int>& st, vector<int>& et, vector<int>& profit) {
        int n = st.size();
        vector<vector<int>> jobs;
        for(int i = 0; i < n; i ++) {
            jobs.push_back({et[i], st[i], profit[i]});
        }
        sort(jobs.begin(), jobs.end());
        sort(et.begin(), et.end());
        vector<int> dp(n + 1);
        for(int i = 1; i <= n; i ++) {
            int s = jobs[i - 1][1], p = jobs[i - 1][2];
            int t = upper_bound(et.begin(), et.end(), s) - et.begin();
            dp[i] = max(dp[i - 1], dp[t] + p);
        }
        return dp[n];
    }
};

你可能感兴趣的:(LeetCode,leetcode,动态规划,算法,c++,二分查找)