这是算法大师的问题: - )
设S
为可能重叠的自然数的一组区间,N为数字列表。
我想找到S的最小子集(让我们称之为P),以便每个数字 在我们的列表N中,P中至少存在一个包含它的间隔。允许P中的间隔重叠。
琐碎的例子:
S = {[1..4], [2..7], [3..5], [8..15], [9..13]}
N = [1, 4, 5]
// so P = {[1..4], [2..7]}
我认为动态算法可能永远不会起作用,所以如果有人知道这个问题的解决方案(或类似的可以转换成的问题),那就太好了。
谢谢!
答案 0 :(得分:2)
你可以用贪心算法来做到这一点。
按顺序考虑N中的点。
对于每个点,如果它已被某个间隔覆盖,则跳过它。
否则,请考虑包含该点的间隔。在这些间隔中,选择覆盖最多未覆盖点的那个。 (这将是具有最高终点的区间。)