【递推】洛谷 P1255 数楼梯

来源:互联网 发布:商业标书知乎 编辑:程序博客网 时间:2024/06/05 23:44

题目描述

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

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

输入输出格式

输入格式:
一个数字,楼梯数。

输出格式:
走的方式几种。

输入输出样例

输入样例#1:
4
输出样例#1:
5

说明

用递归会太慢,需用递推

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

代码

#include<iostream>#include<cstring>using namespace std;int a[5000],b[5000],c[5000],d[5000];int add(int len){    int x=0;    for(int i=1;i<=len;i++)    {        c[i]=a[i]+b[i]+x;        x=c[i]/10;        c[i]%=10;    }    len++;    c[len]=x;    if(c[len]==0)len--;    return len;}void change(int len){    int lenn=len;    for(int i=1;i<=len;i++)d[i]=c[i];    while(b[lenn]==0)lenn--;    for(int i=1;i<=lenn;i++)a[i]=b[i];    for(int i=1;i<=len;i++)b[i]=d[i];}int main(){    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    int n,lenc=1;    cin>>n;    a[1]=1;    b[1]=2;    if(n==0){cout<<'0';return 0;}    else if(n==1){cout<<a[1];return 0;}    else if(n==2){cout<<b[1];return 0;}    else while(n>2)    {        lenc=add(lenc);        change(lenc);        n--;    }    for(int i=lenc;i>=1;i--)cout<<b[i];    return 0;}
0 0