在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)
样例
让我们看一下以下实现以获得更好的理解 −
def solve(n, k):
m = 10 ** 9 + 7
n -= 1
def dp(i, covered, j):
if i == n:
return j == k
if j > k:
return 0
ans = dp(i + 1, False, j) + dp(i + 1, True, j + 1)
if covered:
ans += dp(i + 1, True, j)
return ans % m
return dp(0, False, 0)
n = 4
k = 2
print(solve(n, k))
输入
4, 2
输出
5