面试(1)商汤 n级台阶问题

今天做商汤的在线笔试,算法编程题:台阶一共有n级,每次最低跳1级,最多跳m级,求一共有多少种输出方案

输入一行:n,m   输出一行:总方案数

输入: 4 3

输出:7

4级台阶,一次最多跳3级,共7中方案:

1 1 1 1 

1 2 1

1 1 2

2 1 1

2 2

1 3

3 1

        动态规划问题,先不管是否跳到或跳超过。这样每一次跳台阶有m种选择,记一次跳了i级台阶,则还剩下n-i级,这样就转化成一个子问题,再一次选择跳i级,将n级台阶循环转化为n-i级台阶子问题,利用递归实现动态规划。如果n-i=0,证明刚好跳够了,如果n-i<0,证明调超了,舍弃该方案。

python代码实现如下:

#coding:utf-8
x=raw_input()
k=x.split(" ")
k = [int(k[i]) for i in range(len(k))]
n=int(k[0])
m=int(k[1])

a=[]
def lou(n):
    for i in range(1,m+1):
       if n-i>0:     #n-i大于0,证明没跳完,转为子问题递归
          lou(n-i)
       if n-i==0:    #n-i=0,刚好跳完,append一个0表示有一个方案成立
           a.append(0)

lou(n)
print len(a)     #输出a的长度即共有多少种方案成立

输入:4 3

输出:7

输入:4 4

输出:8

输入:5 4

输出:15

暂未发现不正确的输出

你可能感兴趣的:(面试)