題目描述
樓梯有N階,上樓可以一步上一階,也可以一步上二階。
編一個程序,計算共有多少種不同的走法。
輸入格式
一個數字,樓梯數。
輸出格式
走的方式幾種。
輸入輸出樣例
輸入 #1
4
輸出 #1
5
說明/提示
60% N<=50
100% N<=5000)
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
string add(string a,string b) //高精度加法
{
int c[10000]={0},d[10000]={0},cnt=0,cnt1=0; //數組開大點
for(int i=a.length()-1;i>=0;i--) //字符串a存到c數組
c[cnt++] = a[i]-'0';
for(int i=b.length()-1;i>=0;i--)//字符串b存到d數組
d[cnt1++] = b[i]-'0';
int len=max(a.length(),b.length());
string ans;
int carry=0;
for(int i=0;i<len;i++) //開始對位相加
{
int sum=c[i]+d[i]+carry;
ans += (sum%10)+'0';
carry = sum/10;
}
if(carry) ans+=carry+'0';
reverse(ans.begin(),ans.end()); //最後倒置一下
return ans; //返回答案
}
int main()
{
int n;
string s[5100]={"","1","2"}; //字符串數組,爲了下標對應,第0個""
cin>>n;
if(n==0) cout<<0; //某個測試點
else if(n==1 || n==2) cout<<s[n];
else
{
for(int i=3;i<=n;i++) //遞推
s[i] = add(s[i-1],s[i-2]);
cout<<s[n];
}
return 0;
}