洛谷P1255 数楼梯

题目描述

楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

说明

(60% N<=50 ,100% N<=5000)

题目解析

这边特意将题目中的数据规模写出来,对于60%的数据是小于50,但是对于100%的数据是小于5000,这边就是考虑到C++中的unsigned long long 是否可以存储这个大的数据量了,显然是存不了的,所以在这边我们需要用到高精度加法(使用python和java的忽略这个问题,java有大整数,python无视存储位数)

首先这道题扫一遍就知道是斐波那契数列的解法,我们可以先找一下递推公式。

如果N=1,只有一种走法
如果N=2,由两种走法,分别是1,1、2
如果N=3,由三种走法,分别是1,1,1、1,2、2,1
如果N=4,由五种走法,分别是1,1,1,1、1,2,1、1,1,2、2,1,1,2,2

至此,可以得到递推公式为f[i] = f[i-1] + f[i-2]。

代码实现

#include <iostream>
#include <string>
#include <cstring>
#define maxn 5005
using namespace std;

int a[maxn],b[maxn],c[maxn];


int main() {
    int n,ns=1;
    cin >> n;
    if(n < 3){
        cout << n << endl;
        return 0;
    }else{
        a[1] = 1;b[1] = 2;
        for(int i = 3; i <= n; i ++){
            memset(c,0,sizeof(c));
            for(int j = 1; j <= ns; j ++){
                c[j] = a[j]+b[j];
            }
            for(int j = 1; j <= ns; j ++){
                if(c[j] > 9){
                    c[j+1] += c[j]/10;
                    c[j] -= 10;
                    if(j+1 > ns){
                        ns ++;
                    }
                }
            }
            for(int j = 1; j <= ns; j ++){
                a[j] = b[j];
            }
            for(int j = 1; j <= ns; j ++){
                b[j] = c[j];
            }
        }
    }
    for(int i = ns; i >= 1; i --){
        cout << b[i];
    }
    cout << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37550202/article/details/88365347
今日推荐