给定n段线(进入X轴),坐标为[li; RI。你要选择 覆盖段[0; M]的最小段数。设计一个贪心算法 解决这个问题。
我在这做了什么: 通过按递增顺序的起点对它们进行排序,然后我选择最长的一个,第二个最长......但是这里有一个问题:假设我们想要[0,12]段,并且有3个段:[0,5 ],[5,12],[0,10]。按照算法,它将采用[0,10],然后它不会覆盖所有段,但如果我们采取其他两个,它将掩盖。
你们有其他想法吗?没有排序和采取最长的行不起作用。我们要覆盖[0,12]段,有5段:[0,2] [2,10]。[10,12],[0,6] [6,12] 跟随你的算法前三个被选中,但最后两个是最佳的
答案 0 :(得分:0)
你们有其他想法吗?
我能想到一个非常糟糕的N ^ N算法。
答案 1 :(得分:0)
我不认为它需要是一个不相交的封面,或者你可以使用重叠的封面。在你的例子中,只需[0,10]然后[5,12]。首先看一下从0开始的所有段,然后找到最长的段。我们将这个[0,m]称为下一个所有线段[a,b],以便采用最大m的线段。以这种方式迭代地继续。它将采用| N | * | C |,其中N是线段的数量,c是覆盖线的段数。
答案 2 :(得分:0)
我认为重叠间隔很好,只要它能给出最佳答案。
在我走得更远之前,我想问一下,如果你知道为什么你贪婪的方法未能给出最佳答案? (在阅读下一段之前一分钟思考。)
如果你还没弄清楚原因,请告诉你。你总是选择最长的间隔(排序后),但它可能不是覆盖未覆盖的间隔段的最长间隔。假设你有0-10,5-14,9-15。如果您按最长间隔选择,那么您将选择所有段。选择第一段后,选择第二段只需4个单位,而选择第3段则额外增加5个单位。因此很明显,基于最长间隔长度的拣选并不能提供最佳解决方案。
我想现在你明白了。鉴于它被标记为家庭作业,如果我提出超出这一点的解决方案,它就不合适。