对于网址http://acm.timus.ru/problem.aspx?num=1017&locale=en中提到的楼梯问题
我们可以在线性时间O(k)求解它,其中k是可能的最大步数吗?我觉得使用下面的方法错过了一些逻辑
任何建议?
以下是我实施的代码:
def answer(n):
steps = determine_steps(n)
x = ((n -1) - n/steps) * ((n-2) - n/steps + 1) #Minimum of two stair case
for i in range(3, steps):
x = x * ((n-i)/i) #Stairs from 3 can go from minimum height 0 to max (n-i)/i
return x
def determine_steps(n):
"""Determine no of steps possible"""
steps = 1;
while (steps * steps + steps) <= 2 * n:
steps = steps + 1
return steps - 1
#print answer(212)
print answer(212)
答案 0 :(得分:3)
假设您有一个带2个参数的函数,一个left
是剩余的砖数,另一个是curr
,这是您所在步骤的当前高度。现在,在任何步骤中您都有2个选项。第一个选项是通过再添加一个砖来增加当前步骤的高度,即rec(left-1, curr+1)
,第二个选项是创建一个高度应大于curr
的新步骤,即,rec(left-curr-1, curr+1)
(您创建了一个高度为curr+1
的步长)。现在,left
永远不会是负数,因此if left<0 then return 0
。当left
为0时,我们创建了一个有效的阶梯,即if left==0 then return 1
。
这种情况:if dp[left][curr] !=-1
仅用于记忆。
现在,rec( 212-1, 1 )
表示创建了高度1的步骤,它是当前步骤。并且为了得到最终答案1
,因为任何有效的楼梯应至少包含2个步骤,因此单步楼梯减1。
# your code goes here
dp = [ [-1]*501 for i in range(501) ]
def rec(left, curr):
if left<0:
return 0
if left==0:
return 1
if dp[left][curr] !=-1:
return dp[left][curr]
dp[left][curr] = rec(left-1, curr+1) + rec( left-curr-1, curr+1)
return dp[left][curr]
print ( rec(212-1,1) - 1 )
如果您无法理解代码,请随时发表评论。