超级楼梯 HDU - 2041(递归 + Fibonacci数列)

题目:

有一楼梯共 M 级,刚开始时你在第一级,若每次只能跨上一步或两步,只上不下,要走上第M级,共有多少种走法?

分析:

其实找找规律也能得出结论:答案组是一个 类斐波那契数列,那么我们静下心来分析一下原理,也为后面学习动规打打基础:

倒推一下,假设再跨一次即抵达M,那么这一跨仅两种可能,一步两步 一步两步一步一步是爪牙… 这样我们包装这一跨,推到上一跨,也是只有两种可能,以此类推直到第一跨,可以发现每层非常类似,于是可以递归:

假设目标层为A,抵达A有两个起点B1(A的下一层),B2(A的下下层);将B1(C1,C2两起点),B2(C3,C4两起点)看作新目标层,可得递推公式:F(A) = F(B1) + F(B2)
显然 B1 - B2 = 1(邻层),所以:F(当前) = F(下层) + F(下下层) F(X)为到达第X层的走法种数

实现:

int main() {int T; cin >> T; getchar();
    int n, a[50]={0,1,2};
    
    for(int i = 3; i <= 40; i++)
        a[i] = a[i-1] + a[i-2];
        
    while(T--) {
        cin >> n;
        cout << a[n-1] << endl; //到 M 层 需上 M-1 层
    }
    return 0;
}
发布了54 篇原创文章 · 获赞 43 · 访问量 1941

猜你喜欢

转载自blog.csdn.net/Jungle_st/article/details/104711959