【信息奥赛题解】爬楼梯(详细题解 & C++ 代码)

📚 爬楼梯问题

🚀 题目浏览

【题目名称】爬楼梯
【题目描述】

树老师爬楼梯,他可以每次走 1 1 1 级或者 2 2 2 级,输入楼梯的级数,求不同的走法数。

例如:楼梯一共有 3 3 3 级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共 3 3 3 种方法。

【输入】

输入包含若干行,每行包含一个正整数 N N N,代表楼梯级数, 1 ≤ N ≤ 30 1≤N≤30 1N30

【输出】

不同的走法数,每一行输入对应一行输出。

【输入样例】
5
8
10
【输出样例】
8
34
89
【原题链接】

http://ybt.ssoier.cn:8088/problem_show.php?pid=1204


☘️ 题解分析

爬楼梯问题也是 递推思想 的典型体现,这里把 f[i] 的方案看成了 一个集合,由「最后走 1 步的方案 f[i-1] 」和 「最后走 2 步的方案 f[i-2] 」这 两个子集合 构成,做到了 不重复、不遗漏,因此只需按照方程 f[i] = f[i-1] + f[i-2] 去递推即可。

【误区提示❗️❗️❗️】

此问题容易产生的一个误区,就是把方程书写成 f[i] = f[i-1] + 2*f[i-2]

这是因为在考虑问题时,把「最后一步走几步」✅ 误解成了「最后走几步有多少种方案」❌

这就导致在考虑 f[i-2]时,认为 最后走 2 步有 2 种方案,把 f[i-2] 与 f[2] 产生了联系,所以在 f[i-2] 前乘了 2。❌

仔细思考,我们会发现上面这种思想,本质上导致两个子集出现了重复,因为 「最后走 2 步中,每次走 1 步」的方案,其实是包含在 「最后走 1 步」中的,所以产生了错误。

也就是说,「f[i-2]f[2] 是没有关系的」❗️

初学者在初学时犯了这种错误后,需要仔细思考原因,避免下次再走入这个误区。🍀


🧑🏻‍💻 C++ 代码

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 35;
int tmp;
int f[N];

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    f[1] = 1;
    f[2] = 2;
    for (int i = 3; i < N; ++i) {
        f[i] = f[i - 1] + f[i - 2];  //最后走1步的方案 + 最后走2步的方案
    }

    while (cin >> tmp) {
        cout << f[tmp] << endl;
    }

    return 0;
}

✍️ 写在最后

如果各位小伙伴觉得博主的题解写的不错,可以给本文 点个赞 👍

这样可以让 更加优质的文章更大的概率 被推送到 搜索界面的榜首,为未来的小伙伴们节约更多搜索、阅读的成本。 🚀

同时,你的支持 也是我 不断创作 的动力。☘️

有想要看更多题解报告的小伙伴,也可以关注我的专栏「信息奥赛题解」。

我们下期再见。👋


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值