class Solution {
public:
const int N = 5 * 1e4 + 10;
int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
int dp[N];
vector<vector<int>> jobs;
for (int i = 0; i < startTime.size(); i ++) {
jobs.push_back({startTime[i], endTime[i], profit[i]});
}
sort(jobs.begin(), jobs.end(), [](vector<int> &a, vector<int> &b) -> bool{
return a[1] < b[1];
});
dp[0] = jobs[0][2];
for (int i = 1; i < jobs.size(); i ++) {
dp[i] = dp[i - 1];
int j = i - 1; //j是离i最近的可以选的工作
//没有使用二分去优化查找
while (j >= 0 && jobs[j][1] > jobs[i][0]) {
j --;
}
//特判
if (j == -1) dp[i] = max(dp[i], jobs[i][2]);
else {
dp[i] = max(dp[i], dp[j] + jobs[i][2]);
}
}
return dp[jobs.size() - 1];
}
};
力扣1235_规划兼职工作
最新推荐文章于 2025-11-25 16:52:46 发布
本文介绍了一种使用动态规划解决工作调度问题的方法,通过计算每个任务结束后的最大收益,寻找最优组合。通过迭代和调整,算法避免了二分查找,有效地提高了效率。
422

被折叠的 条评论
为什么被折叠?



