• 走台阶问题


    1. 楼梯有n个台阶,上楼可以一步上1阶,也可以一步上2阶,一共有多少种上楼的方法?
    斐波那契数列  第一项为1 第二项为2 也就是f(n)=f(n-1)+f(n-2),用递归求。
    给个分析的例子:
    有一个11级的台阶,一个人可走一步也可走两步,问这个人有多少种方法走完这个台阶?
    解:
    ①只用一步走:1+1+1+1+1+1+1+1+1+1+1=11,共11步,只有C11,1=1种走法。
    ②用了一次两步走:1+1+1+1+1+1+1+1+1+2=11,共10步,有C10,1 =10种走法。
    ③用了两次两步走:1+1+1+1+1+1+1+2+2=11,共9步,有C9,2 =36种走法。
    ④用了三次两步走:1+1+1+1+1+2+2+2=11,共8步,有C8,3= 56种走法。
    ⑤用了四次两步走:1+1+1+2+2+2+2=11,共7步,有C7,4=35种走法。
    ⑥用了五次两步走:1+2+2+2+2+2=11,共6步,有C6,1=6种走法。
    总共有1+10+36+56+35+6=144种
    理论上分析:只有一个台阶的话,只有1种走法,2级台阶的话,可以一步一个台阶走,也可以一步2个台阶走,共有2种走法。
    当台阶数大于等于3之后,可以这么分析:如果最后一步走一个台阶,那么就是n-1个台阶的走法的种类,如果最后一步走两个台阶,那么就是n-2个台阶的走法的种类,所以n个台阶的走法种类就是n-1个台阶和n-2个台阶的走法的总和。因此,这是一个递归函数。也是一个裴波那契函数。
    下面给出一个C++程序:
    #include<iostream>
    using namespace std;
    int fstep(int n)
    {
     if(n==1)return 1;
     if(n==2)return 2;
     if(n>=3)return fstep(n-2)+fstep(n-1);
     return 0;
    }
    int main()
    {
     int n,step;
     cout<<"input the steps of the stair:"<<endl;
        cin>>n;
     step=fstep(n);
     cout<<"The methods to finish the stair are: "<<step<<endl;
     return 0;
    }
    
  • 相关阅读:
    POJ3783Balls[DP 最坏情况最优解]
    openjudge2989糖果[DP 01背包可行性]
    POJ1160 Post Office[序列DP]
    石子合并[DP-N3]
    POJ1065Wooden Sticks[DP LIS]
    POJ3636Nested Dolls[DP LIS]
    LCIS(最长公共上升子序列)Vijos1264神秘的咒语
    Vijos1680距离/openjudge2988计算字符串的距离[DP]
    Vijos1392拼拼图的小衫[背包DP|二维信息DP]
    NOIP2000方格取数[DP]
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3320431.html
Copyright © 2020-2023  润新知