使用动态编程的可能的楼梯

时间:2016-09-28 17:31:52

标签: algorithm dynamic-programming

对于网址http://acm.timus.ru/problem.aspx?num=1017&locale=en中提到的楼梯问题 enter image description here

我们可以在线性时间O(k)求解它,其中k是可能的最大步数吗?我觉得使用下面的方法错过了一些逻辑

enter image description here

任何建议?

以下是我实施的代码:

    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)

1 个答案:

答案 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 )

如果您无法理解代码,请随时发表评论。