algorithm - 事件选择贪心法(修改)

标签 algorithm greedy

<分区>

Possible Duplicate:
Algorithm to find the maximum sum in a sequence of overlapping intervals

我正在解决以下修改后的事件调度(贪心法)问题:

给定一个包含 n 个事件的集合 S,开始时间为 Sifi,第 ith<​​/strong> 事件的结束时间。还赋予权重wiFoo 进行第 i 项事件所赚取的成本

问题是选择使 foo 收入最大化 的事件。我们必须返回 foo 可以获得的最大成本。假设 Foo 一次只能从事一项事件

注意:

这类似于经典 Activity selection problem ,这里唯一的区别是,对于每个事件,我们都会得到一个成本 wi 。而且这里的目标太不同了 -不是找到最大规模的相互兼容的事件集,在这个问题中我们必须找到使 foo 总收入最大化的那些事件集。

例子

Total activities N=4
Si fi wi
0 1 4000
2 5 100
1 4 3000
4 5 2500

Max earning=9500 (Answer)

我如何修改经典的贪婪事件选择算法来解决这个问题。我应该用什么逻辑来解决上面的问题?

最佳答案

我不知道如何贪婪地解决这个问题。我能看到的解决方案是动态规划,其中你必须解决子问题

F(n) = Foo 在第 n 天后才工作可以获得的最大利润是多少?

那么递归公式就很清楚了:我们有 F(n) 要么等于 F(n+1)(在第 n 天 Foo 不工作的情况下),要么等于F(fi) + wi,对于每个在时间 si=n 开始的事件。

编辑:假设事件的结束时间是 f0 <= f1 <= f2 <= ... <= fN。则答案为 F[f0](从时间 f0 开始的最佳利润是多少),可以计算为:

for n = N to 0:
    F[fn] = F[fn+1]
    for each activity (si, fi, wi):
         if si == fn: 
             F[fn] = max(F[fn], F[fi] + wi)

如果事件根据开始时间按非递增顺序排序,则此方法的复杂度与事件数量成线性关系(因为您可以在 si < N 时停止内部循环)。

关于algorithm - 事件选择贪心法(修改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702316/

相关文章:

c++ - 他贪心吗?

python - 构建贪心任务调度器——Python算法

java - 为什么 long,而不是 int 否则限制时间超过

java - 获得快速的 k 成对独立散列函数的选项是什么

algorithm - 递增子序列的最小数量

最小化最大产品(糖果和气球)的算法

haskell - Haskell 中的 Matroid 类型类(错误)

algorithm - Minimum Coin Change (Infinite, Unbound) 打印值

algorithm - 如何有效地分割图像?

c++ - 如何删除树中的节点?