C++编程例题变态跳台阶的算法分析

问题描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。


问题分析

f(n) 为跳上n级台阶的跳法数。
该青蛙跳上一个n级的台阶时,在第一跳有n种跳法,分别是:跳1级、跳2级…跳n级。
跳完第一跳后,完成接下来的旅程就是下面的情况:
第一跳跳1级,接下来就有f(n-1) 种跳法到达第n级;
第一跳跳2级,接下来就有f(n-2) 种跳法到达第n级;
。。。
。。。
第一跳跳n级,直接结束旅程。

因此,我们可以把跳上一个n级的台阶 分解成 第一跳后续,即
f(n)=f(n-1)+f(n-2)+…+f(1)+1
其中 f(n-1) 对应第一跳跳了1级的情况,f(n-2) 对应第一跳跳了2级的情况,…,f(1) 对应第一跳跳了n-1级的情况,1 对应第一跳跳了n级的情况。
同时注意到,f(n-1)=f(n-2)+f(n-3)+…+f(1)+1 ,用 f(n-1) 替换掉 f(n) 中的 f(n-2)+…+f(1)+1 ,可以得到 f(n)=2f(n-1). ;即 f(n) 是个以2为比的等比数列。

我们再通过枚举得到 f(1)=1, f(2)=2 ,就可以推出 f(n)=2n-1.


代码实现

看懂算法之后,代码就很简单辣 ~ 一句话搞定:

class Solution {
public:
    int jumpFloorII(int number) {
        return pow(2,number-1);
    }
};

你可能感兴趣的:(编程例题)