题目描述
楼梯有N
𝑁
级台阶,上楼可以一步上一阶,也可以一步上二阶。编一递归程序,计算共有多少种不同走法?
样例
输入
3
输出
3
提示
n<5000
本题思路很简单,但数据太大要用到数组进行存储
#include<bits/stdc++.h>
using namespace std;
//定义了一个返回类型为数组的类型
vector<int> add(const vector<int>& a, const vector<int>& b) {
vector<int> result;
int carry = 0;//代表进位
int i = 0, j = 0;
while (i < a.size() || j < b.size() || carry > 0) {
int sum = carry;
if (i < a.size()) sum += a[i++];
if (j < b.size()) sum += b[j++];
result.push_back(sum % 10);
carry = sum / 10;
}
return result;
}
vector<int> count(int n) {
if (n <= 0) return vector<int>{0};
if (n == 1) return vector<int>{1};//楼梯为一阶的走法有一种
if (n == 2) return vector<int>{2};//楼梯为两阶的走法有两种
vector<int> dp1{1};
vector<int> dp2{2};
for (int i = 3; i <= n; ++i) {
//实现了递推
vector<int> dp = add(dp1, dp2);//最后一步可以上两阶,也可以上一阶
dp1 = dp2;
dp2 = dp;
}
return dp2;
}
void print(const vector<int>& v) {
//逆序输出
for (auto it = v.rbegin(); it!= v.rend(); ++it) {
cout << *it;
}
cout << endl;
}
int main() {
int n ;
cin>>n;
vector<int> ways = count(n);
print(ways);
return 0;
}
//高精度加,很巧妙
int carry = 0;
int i = 0, j = 0;
while (i < a.size() || j < b.size() || carry > 0) {
int sum = carry;
if (i < a.size()) sum += a[i++];//!!
if (j < b.size()) sum += b[j++];//!!
result.push_back(sum % 10);
carry = sum / 10;
}
总结:本题运用了高精度加,递推算法并灵活运用了vector的性质