我想知道是否有人可以帮我理解DP算法的未加权间隔调度。
我给了2个数组[t1,...,tn]和[d1,...,dn],其中ti是作业i的开始时间,di是作业i的持续时间。此外,作业按开始时间排序,因此t1< = t2< = ...< = tn。我需要最大化可以执行而没有任何重叠的作业数量。我正在尝试为此问题提出DP算法和运行时。任何帮助将不胜感激!
谢谢!
答案 0 :(得分:0)
对不起,我现在没有时间花在这个问题上了。这是一个想法,我认为它非常适合动态编程。 [实际上我认为是 DP,但自从我上次研究这些事情已经过去了近二十年......]
假设T = {t1, t2, ..., tn}
按如下方式进行分区:
T = {t1, t2, ..., tn} = {t1, t2, ..., tk} U {tk+1, tk+2, ..., tn}
= T1(k) U T2(k)
让T2'(k)
成为T2(k)
不包含重叠T1(k)
的作业的子集。
让opt(X)
成为X
的子集T
的最佳值。然后
opt(T) = min( opt( T1(k) ) + opt( T2'(k) )
其中最小值采用任何可能的k in {1, 2, ..., n}
当然,您需要递归计算opt()
,并考虑重叠。
希望这有帮助!
答案 1 :(得分:0)
我最容易想到的是,如果我认为你找出每个工作的结束时间并将工作按照增加结束时间的顺序排序,尽管你可以使用同样的方法来实现开始时间在相反的方向工作。
按照增加结束时间的顺序考虑每项工作。对于每项工作,如果您决定从事该工作,则可以计算出您可以处理的最多工作数,包括该工作。要解决这个问题,请查看已计算的答案,这些答案涵盖了该作业的开始时间,并找到涵盖最大作业数的答案。在处理您正在考虑的工作时,您可以做的最好的事情是加上最大数量。
当您考虑了所有作业后,您可以覆盖的最大数量是您在考虑任何作业时计算的最大数量。您可以通过存储在确定特定作业可能的最高分数时确定的上一个作业来确定要执行的作业,然后以最高分数从作业中追溯这些指针。
考虑到N个工作时,你会在计算每个工作的最佳分数时回顾最多N个先前计算的答案,所以我认为这是O(N ^ 2)