• 走台阶问题汇总(青蛙跳台阶,花式上台阶等……


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

    >>>一只青蛙一次可以跳上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;
    }

    以上~

  • 相关阅读:
    X-Plosives (并查集)
    HDU1272小希的迷宫 (并查集)
    React 初学
    js 插件 issue
    js常用方法
    常用网址
    js 零零散散的总结。
    git 常用命令
    es6 babel编译
    屏幕适配
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13743885.html
Copyright © 2020-2023  润新知