"青蛙跳台阶"问题是一个经典的递归问题,也与斐波那契数列有关。问题是这样的:一只青蛙站在一个n阶台阶上,它每次可以跳1阶或2阶,问青蛙跳到顶端总共有多少种跳法。
这个问题可以用递归或动态规划来解决。以下是使用C++实现的动态规划解法:
#include <iostream>
#include <vector>
// 动态规划解法
int climbStairs(int n) {
if (n <= 2) {
return n;
}
// 创建一个数组来存储子问题的解
std::vector<int> dp(n + 1, 0);
// 初始化前两个台阶的跳法
dp[1] = 1;
dp[2] = 2;
// 计算从3阶到n阶的跳法
for (int i = 3; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
// 返回n阶台阶的跳法总数
return dp[n];
}
int main() {
int n = 5;
std::cout << "Number of ways to climb " << n << " steps is: " << climbStairs(n) << std::endl;
return 0;
}
这段代码中,climbStairs
函数使用了一个std::vector<int>
来存储子问题的解,避免了重复计算。数组dp[i]
表示到达第i
阶台阶的跳法数。根据题目条件,到达第i
阶台阶的跳法数等于到达(i-1)
阶和(i-2)
阶台阶的跳法数之和。
面试回答示例:
"青蛙跳台阶问题可以通过动态规划来解决。我们首先定义一个数组dp
,其中dp[i]
表示到达第i
阶台阶的跳法数。我们知道到达第一阶和第二阶都只有一种方法。对于更高的台阶,到达那里的方法数是到达前一阶和前两阶台阶的方法数之和,因为青蛙可以选择从这两个位置跳过来。我们从第三阶台阶开始,逐步计算直到第n
阶,最终返回dp[n]
作为答案。这种方法避免了递归方法中的重复计算,时间复杂度是O(n),空间复杂度也是O(n)。"