zoukankan      html  css  js  c++  java
  • 走台阶问题汇总(青蛙跳台阶,花式上台阶等……

    相信很多人第一次接触到台阶问题都是青蛙跳台阶吧,如下:

    >>>一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)

    可以推断出,

    当台阶数是1时,只有一种跳法,当台阶数是2时,有两种跳法;

    当台阶数是3时,第一次跳,要么是跳一级,要么是跳两级,这两种状态,产生两种完全不同的结果。

    如果跳一级,那么剩下的就是n-1级台阶的跳法;

    如果跳两级,那么剩下的就是n-2级台阶的跳法;

    所以第一步怎么跳,决定了后续的跳法,所以总的跳法是f(n-1)+f(n-2)的跳法。

    由此可以得出可以使用斐波那契数列求解:

    //递归方法,数据较大时可能超时
    int febonaci(int n){ //n为台阶数 if(n==1) return 1; if(n==2) return 2; else return jumpFloor(n-2)+jumpFloor(n-1); }
    //利用数组的循环方法
    int febonaci(int n){
        vector<int> v;
        v.push_back(1);   //先将数列前两个值放入
        v.push_back(2);
        for(int i=2;i<n;i++){
        v.push_back(v[i-1]+v[i-2]);   //数组内存储斐波那契数列
    }
        cout<<v[n-1]<<endl;
    }
    

      

    然后可以了解扩展题型:

    >>>楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法

    其实思想与前一题差不多,就当做熟悉题型了

    第n阶=第n-1阶走一步总走法+第n-2阶走2步总走法+第n-3阶走3步总走法

    int solve(int n){
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(4);
    	for (int i = 3; i < n; i++){
    		v.push_back(v[i - 3] + v[i - 2] + v[i - 1]);
    	}
    	cout << v[n - 1] << endl;
    }
    //当然,为了约束运行时间,也可在读入数据前就构造好足够大的数列,然后直接进行输出
    //这里同样给出递归算法,res为最终结果
    long res;
    void solve(int n)
    {
        if(n<0)
        {
            return;
        }
        if(n==0)
        {
            res++;
            return;
        }
        for (int i=1; i<=3; i++)
        {
            solve(n-i);
        }
    }
    int main(){
    ……
    cout<<solve(n)<<endl;
    ……
    }

    然后是台阶类问题的最终题型:

    >>>有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式,一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod100003 (不通题目要求可能不同)后的结果

    其实思想还是一样的,但是对于这种题目来说数据一般较大,不适用于递归写法,所以一般都是用数组解决

    #include<iostream>
    using namespace std;
    int main()
    {
        
        int n,k;
        vector<int> a(100003);
        int i,j;
        cin>>n>>k;//输入n、k
        a[0]=1;//初始条件
        for(i=1;i<=n;i++)//从头到尾进行递推
        {	
            for(j=1; j<=k && i-j>=0 ;j++)     //当前阶数最少1到最大k阶依次累加
                a[i]+=a[i-j];
            
            a[i]%=100003;    //按要求进行处理
        }	
        cout<<a[n]<<endl;
        return 0;
    }

    以上~

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.2.25
    Elementary Methods in Number Theory Exercise 1.2.14
    图解欧几里德算法
    图解欧几里德算法
    Elementary Methods in Number Theory Exercise 1.2.14
    Android中的长度单位详解(dp、sp、px、in、pt、mm)
    分享下多年积累的对JAVA程序员成长之路的总结
    android异常之都是deamon惹的祸The connection to adb is down, and a severe error has occured.
    TomatoCartv1.1.8.2部署时报错
    JavaScript浏览器对象之二Document对象
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13743885.html
Copyright © 2011-2022 走看看