如何解决了解加权作业计划
给出问题:
我们有n个工作,其中每个工作计划从startTime [i]到endTime [i]完成,从而获得利润利润[i]。 为您提供了startTime,endTime和Profit数组,您需要输出可以获取的最大利润,以使子集中不存在2个具有重叠时间范围的作业。 如果您选择的工作在时间X结束,那么您将能够启动在时间X开始的另一工作。
我对问题的理解: 基本思想是我们需要在set [0 ... i]中找到可以带来最大利润的工作集。如果第(i + 1)个工作可以带来最大的利润,则可以通过添加一些工作索引i来相加,否则,我们将不包含第(i + 1)个工作作为最大利润存储所获得的利润。
幼稚的算法涉及根据endTime对作业进行排序,并应用两个for循环。外层人员遍历工作,内层人员检查与当前工作不冲突的最新工作,增加利润并取当前和以前的最大值。
但是,我们可以通过使用二进制搜索来找到最新的不冲突的作业来改善这一点,从而提供更有效的算法。我正在尝试实现后一种,但是在一些测试用例中却遇到了一些问题。
int jobScheduling(vector<int>& startTime,vector<int>& endTime,vector<int>& profit) {
int n = startTime.size();
vector<vector<int>> T;
for(int i=0;i<n;i++){
T.push_back({startTime[i],endTime[i],profit[i]});
}
sort(T.begin(),T.end(),[](vector<int> &a,vector<int> &b){
return a[1]<b[1];
});
sort(endTime.begin(),endTime.end());
// sort(startTime.begin(),startTime.end());
vector<int> dp(n+1,0);
for(int i=0;i<n;i++){
int curr_max = T[i][2];
int index = lower_bound(endTime.begin(),endTime.end(),T[i][0]) - endTime.begin();
if(index==n || index>=0 && index<n && endTime[index]>T[i][0])
index--;
curr_max = curr_max+dp[index+1];
dp[i+1] = max(dp[i],curr_max);
}
return dp[n];
}
我无法弄清楚我在实施中出了什么问题。请帮我解决一下这个。也欢迎任何其他改进算法的建议。 谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。