【发布时间】:2019-10-29 01:21:47
【问题描述】:
问题是输出是否可以从给定点(a,b)移动到目标(c,d)
我们仅限于正坐标
以下两个动作是可能的
(a,b) -> (a+b,b)
(a,b) -> (a,b+a)
例如,(1,1) 到 (5,4) 是 True
您可以执行以下操作:使用第二步 3 次,(1,1) -> (1,2) -> (1,3) -> (1,4) 使用第一步 1 次 (1,4) -> (5,4)
我想出了以下递归方法
def move(a,b,c,d):
if a==c and b==d:
return True
elif a>c or b>d:
return False
else:
ans = False
if a < c:
if move(a+b,b,c,d):
return True
if b < d:
if move(a,b+a,c,d):
return True
return False
a) 我的解决方案是否涵盖所有可能的情况。由于我没有测试用例,因此我无法确定验证,但我认为我确实考虑了所有因素。
b) 我的解决方案的时间复杂度是多少?我认为它是指数级的,但不能肯定地说。
c) 是否有更好的解决方案(就时间复杂度而言)。我们可以使用动态规划吗?
感谢您的任何意见。
【问题讨论】:
-
我认为你可以通过
elif a>c or b>d:而不是and来优化它 -
@ScottSauyet 是的,抱歉。固定
-
我认为您的解决方案不能涵盖所有情况,那么:(1, -1) -> (0, -1)
-
所以问题是:数字必须是正数吗?如果是这样,我认为有一个更快的解决方案。
-
@ScottSauyet 是否涉及 GCD?
标签: algorithm recursion time-complexity dynamic-programming