题目描述:假设有一个n级的台阶,每次可以向上跳一级,两级,三级…N级。问一共有多少中跳法呢?
分析:这是一道典型的动态规划的题目,我们可以这样想,我们最后一步可以跳1级,也可以跳2级,跳三级…跳N级,我们用最后一步跳一级来举例子,假设最后一步跳1级,那还剩下n-1个台阶,又可以分为最后一步跳1级,2级…直到n-1级。 好啦,就分析到这里,我们可以看到当我们最后一步跳一级的时候,剩下的n-1级台阶又是一个同样的范围缩小的子问题,我们当然可以使用递归来做,最好构件一个辅助数组,可以节省大量的运算量。
接下来讲解我的代码:
我以n = 3 时举例:
只有 1 级台阶 : 只有1 种 跳法;
只有 2 级台阶 : 有 2 中跳法;
当有 3 级台阶时: 我们要分为三种情况
(1) 最后一步跳一级 , 剩下2级,即再跳个2级的就可以了
(2) 最后一步跳两级 , 剩下1级,即再跳个1级的就可以了
(3) 最后一步跳三级, 没台阶了,一步到位即 算 1 中方法
算法已经很清楚了
f(1) = 1
f(2) = 2
f(3) = f(2) + f(1) + 1 = 4
f(4) = f(3) + f(2) + f(1) + 1 = 8
…
其实呢,这是个公比为2,首项为1的等比数列;
所以第n项的值是 f(n) = a1 * q^(n-1)
所以我们可以使用移位来运算,将1向左移位,每移1位,就相当于乘2,刚好数列符合公式。
作者:时光凉啦啦啦啦啦
https://www.bilibili.com/read/cv2394003
出处: bilibili