题目描述
楼梯有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;
}