1235. 规划兼职工作
题目链接:1235. 规划兼职工作
代码如下:
//动态规划+二分查找
//参考链接:https://leetcode.cn/problems/maximum-profit-in-job-scheduling/solutions/1910416/gui-hua-jian-zhi-gong-zuo-by-leetcode-so-gu0e
class Solution
{
public:
int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit)
{
vector<vector<int>> jobs(startTime.size());
for(int i=0;i<startTime.size();i++)
{
jobs[i]={startTime[i],endTime[i],profit[i]};
}
sort(jobs.begin(),jobs.end(),[&](const vector<int>& job1,const vector<int>& job2)
{
return job1[1]<job2[1];//按结束时间从小到大排序
});
vector<int> dp(startTime.size()+1);//dp[i]表示前i份兼职工作可以获得的最大报酬
for(int i=1;i<=startTime.size();i++)
{
int k=upper_bound(jobs.begin(),jobs.begin()+i-1,
jobs[i-1][0],[&](int st,const vector<int>& job)->bool
{
return st<job[1];
})-jobs.begin();
dp[i]=max(dp[i-1],dp[k]+jobs[i-1][2]);
}
return dp[startTime.size()];
}
};