我准备进行决赛,这是一个练习题。这不是一个家庭作业问题。
我如何进行攻击呢?此外,更一般地说,我如何知道何时使用贪婪与动态编程?直觉上,我认为这是一个使用贪婪的好地方。我也在想,如果我能以某种方式创建一条正交线并“扫描”它,检查每个点的#of交叉点并更新全局最大值,那么我可以在扫描结束时返回最大值。我不确定如何在算法上进行平面扫描。
一个。我们给出了一组活动I1 ... In:每个活动Ii由其左点Li和右点Ri表示。设计一种非常有效的算法,找到相互重叠的活动子集的最大数量(用英文编写解决方案,按子弹编写)。
湾分析算法的时间复杂度。
建议的解决方案:
Ex set:{(0,2)(3,7)(4,6)(7,8)(1,5)} 区间4-5的最大值为3
1)将起点和终点分成两个独立的数组,并按非递减顺序对它们进行排序
起点:[0,1,3,4,7](SP) 终点:[2,5,6,7,8](EP)
我知道我可以使用两个指针来模拟平面扫描,但我不确定如何。我被困在这里。
答案 0 :(得分:0)
我说你的扫描想法很好。
您不必担心平面扫描,只需使用开始/结束点。将元素放入队列中。在每个步骤中,从队列前端获取较小的元素。如果它是一个起始点,则增加当前任务的数量,否则减去它。
由于您不需要指出哪些任务重叠 - 只是计算它们的数量 - 您不必担心特定任务的持续时间。
关于你的贪婪与DP问题,在我的非专业观点中,贪婪可能并不总能提供有效答案,而DP只适用于可以分成较小子问题的问题。在这种情况下,我也不会打电话给你的扫描解决方案。