我理解经典的楼梯问题,当您可以步进1、2或3次并显示达到第n步的独特方式时。但是我被要求允许用户输入他们希望的任何间隔步长以及楼梯的大小。例如楼梯尺寸10,间隔为{1,3,5}。我正在努力地从概念上理解完成此任务所需的算法,我们将不胜感激。
答案 0 :(得分:0)
创建一个大小为N
的数组,其中arr [i]代表从第一步开始到达i'th
步骤的方式。
任何步骤i
与step_array之间的关系为:-
for step in step_array:
arr[i]=arr[i]+arr[i-step]
您必须对每个i值重复此操作。
假设您当前处于步骤i
,并且允许的步骤为[2,6,19]
您的上一步可能是什么?
由于仅允许step_array中存在的那些步骤,因此您必须在以下位置:-
i-2
i-6
i-19
由于只有这些步骤才能将您引导至i。
答案 1 :(得分:0)
我今天花了很多时间来理解这个问题。希望我能解释。我将尝试通过一个示例进行说明,我认为这样会使示例更易于理解。
For example if step sizes are: [1,3,5]
n = number of stairs
n(0) = 1 way, to be at the same position it will be 1 way
n(1) = [1] = 1
n(2) = [1,1] = 1
n(3) = [1,1,1] , [3] = 2 ways
n(4) = [1,1,1,1] , [1,3] , [3,1] = 3 ways
n(5) = [1,1,1,1,1] , [1,1,3] , [1,3,1] , [3,1,1] , [5] = 5 ways
n(6) = [1,1,1,1,1,1] , [1,1,1,3] , [1,1,3,1] , [1,3,1,1] , [3,1,1,1] , [3,3] , [1,5] , [5,1] = 8 ways
now if we look closely, n(6) can be achieved in 3 ways:
1. taking 1 step first
2. taking 3 step first
3. taking 5 step first
so other way to write n(6) would be:
n(6) = [1,1,1,1,1,1] , [1,1,1,3] , [1,1,3,1] , [1,3,1,1] , [1,5] >> 1st step is 1
[3,1,1,1] , [3,3] >> 1st step is 3
[5,1] >> 1st step is 5
所以我们可以说:
n(6) = 1st step is 1 + {[1,1,1,1,1] , [1,1,3] , [1,3,1] , [3,1,1] , [5]} >> 1+n(5)
1st step is 3 + {[1,1,1] , [3]} >> 3+n(3)
1st step is 5 + {[1]} >> 5+n(1)
即:
n(6) = n(5) + n(3) + n(1)
or
n(6) = n(n-1) + n(n-3) + n(n-5)
但是如果(n-3)或(n-5)变为负数怎么办,则不会考虑,因为不会采取任何步骤
因此,如果我处于[1,3,5] >>步骤中 我们可以这样说: 如果(n-i)> 0,我们将其添加到计算步数的函数中
或者: 对于[1,3,5] >>中允许的步骤i: 如果(n-i)> = 0 我们添加步骤
因此,如果n为4:并且i = [1,3,5] 会是:
n(4) = n(3) + n(1)
因此上述步骤也可以写为:
n(0) = 1
n(1) = 1
n(2) = n(1)
n(3) = n(2) + n(0)
n(4) = n(3) + n(1)
n(5) = n(4) + n(2) + n(0)
n(6) = n(5) + n(3) + n(1)
希望我能解释。使用python的解决方案如下:
def simplestairs(n,X):
if n == 1:
return 1
cache = [0 for _ in range(n+1)]
cache[0] = 1
cache[1] = 1
for i in range(2,n+1):
for x in X:
if i - x >= 0:
cache[i] += cache[i-x]
return cache[-1]
n = 6
X = {1,3,5}
simplestairs(n,X)