P1255 数楼梯
题目描述
楼梯有 NNN 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例 #1
输入 #1
4
输出 #1
5
说明/提示
- 对于 60%60\%60% 的数据,N≤50N \leq 50N≤50;
- 对于 100%100\%100% 的数据,1≤N≤50001 \le N \leq 50001≤N≤5000。
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; // 严格要求 (将long long 类型取别名为ll)
string dp[10100];
string func(string s1, string s2){
string s3;
ll a[10010] = {0};
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
ll d1 = s1.size(), d2 = s2.size(), d = max(d1, d2); //d为加一起和的最大下标(注意下标从0开始)
for(ll i = d1; i <= d; i++) s1 += '0';
for(ll i = d2; i <= d; i++) s2 += '0';
ll cnt = 0;
for(ll i = 0; i <= d; i++){
ll x1 = s1[i] - '0', x2 = s2[i] - '0', x = x1 + x2 + cnt;
a[i] = x % 10;
cnt = x / 10;
}
while(a[d] == 0){
d--;
}
for(ll i = d; i >= 0; i--){
s3 += char(a[i] + '0');
}
return s3;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n;
cin >> n;
dp[1] = "1";
dp[2] = "2";
for(ll i = 3; i <= n; i++){
dp[i] = func(dp[i - 1], dp[i - 2]);
// cout << dp[i] << endl;
}
cout << dp[n] << endl;
return 0;
}