走楼梯(递推算法)

题目描述
楼梯有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的性质

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值