在Python中查找k个不重叠线段集合的程序
假设我们在线上有n个点,第i个点(从0到n-1)位于位置x = i,我们必须找出我们可以绘制恰好k个不同的不重叠线段的方式,使得每个线段覆盖两个或多个点。每条线段的端点必须具有整数坐标。这k条线段不必覆盖所有给定的n个点,且它们可以共享端点。如果答案过大,则返回结果mod 10 ^ 9 + 7。
因此,如果输入为n = 4 k = 2,则输出将为5,因为我们可以有五个可能性[(0至2),(2至3)],[(0至1),(1至3)],[(0至1),(2至3)],[ (1到2),(2到3)]和[(0到1),(1到2)]
要解决此问题,我们将按照以下步骤进行 −
- m:= 10 ^ 9 + 7
- n:= n-1
- 定义一个函数dp()。这将取i,covered,j
- 如果i与n相同,则
- 返回True(如果j与k相同)否则返回False
- 如果j > k,则
- ans:= dp(i + 1,False,j) + dp(i + 1,True,j + 1)
- 如果cover为True,则
- ans:= ans + dp(i + 1,True,j)
- 返回ans mod m
- 从main方法返回dp(0,False,0)
样例
让我们看一下以下实现以获得更好的理解 −