数楼梯

洛谷 P1255 数楼梯
题目描述

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

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

输入输出格式
输入格式:

一个数字,楼梯数。

输出格式:

走的方式几种。


终于知道为什么爬楼梯就是斐波那契数列了…

按照递归思想,走n级楼梯先走第1级楼梯,而第一步走法就两种,一步一格或一步两格.
于是爬n级楼梯=一步一格+爬n-1级
或一步两格+爬n-2级
然后递归式出炉—-f(n)=f(n-1)+f(n-2)//嗯…为啥这么眼熟

因为数据范围较大,自己写的只有50分,题解里好像都在说高精加什么的(表示吾不会…),勉强找到篇看懂的

#include 
#include 
using namespace std;
int f[5005][5005];
//f[x][y]表示上x个台阶所需步数的第y位 
int len=1;
void fib(int n)
{

    for(int i=1;i<=len;i++)
    {
        f[n][i]=f[n-1][i]+f[n-2][i];
        //斐波那契公式 
    }
    for(int i=1;i<=len;i++)
    {
        if(f[n][i]>=10)
        {
            f[n][i+1]+=f[n][i]/10;
            //注意是+=,因为第i+=位本身可能有数 
            f[n][i]%=10;
            if(f[n][len+1])
            {
                len++;
                //如果下一位有数则更新长度,方便输出
                //真心看不懂压位啊去0啊什么的 
            }
        }
    }
}
int main(){
    memset(f,0,sizeof(f));
    int n;
    cin>>n;
    f[0][1]=0;
    f[1][1]=1;
    f[2][1]=2;
    for(int i=3;i<=n;i++)
    {
        fib(i);
    }
    for(int i=len;i>0;i--)//倒序输出 
    {
        cout<return 0;
} 

你可能感兴趣的:(数楼梯)