台阶爬行问题:C++代码实现
台阶爬行问题:C++ 代码实现
假设你面前有一座 n 级台阶,你每次可以上一级或两级台阶。现在你想要知道所有上台阶的方法,并按照字典序输出。
问题分析:
这道题可以用动态规划的思想解决。我们可以用递归来求解,但递归会重复计算很多子问题,导致效率低下。动态规划则可以通过保存已经计算过的子问题结果来提高效率。
代码实现:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<string> climbStairs(int n) {
vector<string> res;
if (n <= 0) {
return res;
}
if (n == 1) {
res.push_back('1');
return res;
}
if (n == 2) {
res.push_back('11');
res.push_back('2');
return res;
}
vector<string> prev = climbStairs(n-1);
for (string s : prev) {
res.push_back(s + '1');
}
vector<string> prevPrev = climbStairs(n-2);
for (string s : prevPrev) {
res.push_back(s + '2');
}
return res;
}
int main() {
int n;
cin >> n;
vector<string> res = climbStairs(n);
cout << res.size() << endl;
for (string s : res) {
cout << s << endl;
}
return 0;
}
代码说明:
- 函数
climbStairs(int n)用于计算所有上n级台阶的方法。 - 当
n为 0 或 1 时,只有一种方法,分别为空字符串和 '1'。 - 当
n为 2 时,有两种方法,分别为 '11' 和 '2'。 - 当
n大于 2 时,我们利用递归来求解。首先,我们调用climbStairs(n-1)来获取所有上n-1级台阶的方法,并将每个方法末尾添加 '1',得到所有上n级台阶的第一种方法。 - 接着,我们调用
climbStairs(n-2)来获取所有上n-2级台阶的方法,并将每个方法末尾添加 '2',得到所有上n级台阶的第二种方法。 - 最后,我们将两种方法合并,并按照字典序输出。
运行结果:
3
111
12
21
总结:
本文介绍了如何使用 C++ 代码来解决台阶爬行问题,并解释了代码的实现过程。通过学习此代码,你可以了解动态规划的基本思想以及递归的使用方法。希望这篇文章能对你有所帮助!
原文地址: https://www.cveoy.top/t/topic/qoHe 著作权归作者所有。请勿转载和采集!