按结束时间 b 从小到大排序。这样考虑前 i 个工单时,所有可能与第 i 个相接或更早结束的工单都在它前面一段前缀里。
设 dp[i] 为只考虑排序后前 i 个工单时的最大收益。对第 i 个工单(开始 a、结束 b、收益 w):
不选:值为 dp[i−1];
选:需要前面结束时间不超过 a 的工单(因为 [x,y) 与 [a,b) 在 y≤a 时不冲突),即 dp[k]+w,其中 k 是满足 bk≤a 的最大下标。
k 可在已排序的结束时间上二分得到。dp[i]=max(dp[i−1],dp[k]+w)。
题目内容
部门项目排期需要安排若干开发任务。现有 m 个工单,第 i 个工单占用时间区间 [ai,bi),完成收益为 wi。同一时刻只能执行一个工单,被选中的工单时间不能重叠;每个工单最多选一次,可选任意多个。若一个工单在时刻 t 结束、另一个恰好在时刻 t 开始,则二者不冲突。请给出能得到的最大总收益。
输入描述
首先一行一个整型 m(1≤m≤250000),表示工单数量。
随后 m 行,每行三个整型 a,b,w(0≤a<b≤1×109,1≤w≤1×109),表示一个工单的开始时间、结束时间与收益。工单不保证按时间排序。