今天做商汤的在线笔试,算法编程题:台阶一共有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
暂未发现不正确的输出