爬楼梯。题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。 输入格式:输入一个整数n,(1<=n<46)。 输出格式:输出当楼梯阶数是n时的上楼方式总数。 输入样例:1 输出样例:1 输入样例:4 输出样例:7 输入样例:24 输出样例:1389537如何用c语言写出来
时间: 2024-02-09 09:09:02 浏览: 22
这是一个经典的动态规划问题,可以用递归或迭代的方式实现。以下是用迭代的方式实现:
```c
#include <stdio.h>
int climbStairs(int n) {
int dp[3] = {1, 1, 2}; // dp数组存储每一步的结果
for (int i = 3; i <= n; i++) {
dp[i % 3] = dp[(i - 1) % 3] + dp[(i - 2) % 3] + dp[(i - 3) % 3];
}
return dp[n % 3];
}
int main() {
int n;
scanf("%d", &n);
printf("%d\n", climbStairs(n));
return 0;
}
```
上述代码中,用 `dp` 数组存储每一步的结果,`dp[i]` 表示爬到第 `i` 级台阶的总爬法数。因为每次只需要用到前三个状态,所以用三个变量存储即可,避免了使用一个数组的空间浪费。最后返回 `dp[n]` 即可得到结果。
相关问题
爬楼梯。题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。
### 回答1:
小明爬楼梯的方法有三种:一次爬一个台阶、一次爬两个台阶、一次爬三个台阶。如果楼梯有n个台阶,那么小明的爬法可以分为以下几种情况:
1. 如果n=1,那么小明只能一次爬一个台阶,只有一种爬法。
2. 如果n=2,那么小明可以一次爬两个台阶或者分别爬两次一个台阶,共有两种爬法。
3. 如果n=3,那么小明可以一次爬三个台阶、先爬两个再爬一个、先爬一个再爬两个、分别爬三次一个台阶,共有四种爬法。
4. 如果n>3,那么小明可以先爬一个台阶,剩下的n-1个台阶可以看成一个子问题,共有f(n-1)种爬法;也可以先爬两个台阶,剩下的n-2个台阶可以看成一个子问题,共有f(n-2)种爬法;还可以先爬三个台阶,剩下的n-3个台阶可以看成一个子问题,共有f(n-3)种爬法。因此,小明爬n个台阶的总爬法数为f(n)=f(n-1)+f(n-2)+f(n-3)。
根据以上分析,可以用递归或动态规划的方法求解小明爬楼梯的总爬法数。
### 回答2:
假设小明爬n个台阶有f种爬法,我们需要找到它的递推公式。
当n=1时,小明只能一次爬1个台阶,所以f(1)=1;当n=2时,小明可以一次爬1个或者一次爬2个,所以f(2)=2;当n=3时,小明可以一次爬1个、一次爬2个或者一次爬3个,所以f(3)=4。
以此类推,当n>3时,小明可以从第n-1个台阶爬1个台阶到达第n个台阶,也可以从第n-2个台阶爬2个台阶到达第n个台阶,还可以从第n-3个台阶爬3个台阶到达第n个台阶,因此小明爬n个台阶的总爬法即为:
f(n) = f(n-1) + f(n-2) + f(n-3)
如果从键盘输入的n=1或2或3,直接输出对应的f(n)值;否则,可以使用动态规划算法,从f(4)开始递推计算出f(n)的值。
代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入楼梯的台阶数n:";
cin >> n;
int f1=1, f2=2, f3=4, f;
if (n == 1) f = f1;
else if (n == 2) f = f2;
else if (n == 3) f = f3;
else {
for (int i=4; i<=n; i++) {
f = f1 + f2 + f3;
f1 = f2;
f2 = f3;
f3 = f;
}
}
cout << "小明爬" << n << "个台阶的总爬法为:" << f << endl;
return 0;
}
### 回答3:
其实这是一道典型的动态规划问题。我们可以用dp数组来记录小明爬上n阶楼梯的所有方法数。其中,dp[i]表示小明爬上i阶楼梯的方法数。对于dp[i],它可以从dp[i-1],dp[i-2],和dp[i-3]转移过来。因为小明每次只能爬1、2、或3个台阶。所以实际上就是一个斐波那契数列的变种。
因此,我们可以写出如下的递推式:
dp[0] = 1(初始情况,因为小明可以不爬任何台阶,此时方法数为1)
dp[1] = 1(小明只能爬一个台阶,只有一种方法)
dp[2] = 2(小明可以爬一个或两个台阶)
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
最终,dp[n]就是小明爬上n阶楼梯的方法数。
下面是python代码实现:
n = int(input())
dp = [0] * (n+1)
dp[0], dp[1], dp[2] = 1, 1, 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
print(dp[n])
可以发现,这个算法的时间复杂度是O(n),因为要遍历所有的n个台阶。虽然时间复杂度不算太高,但是空间复杂度比较高,需要n+1个空间存储dp数组。如果想优化空间复杂度,可以只用三个变量记录dp[i-1],dp[i-2]和dp[i-3],递推的时候不断更新它们即可。
爬楼梯。题目内容:可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。 输入格式:输入一个整数n,(1<=n<46)。 输出格式:输出当楼梯阶数是n时的上楼方式总数。 输入样例:1 输出样例:1 输入样例:4 输出样例:7 输入样例:24 输出样例:1389537 时间限制:500ms内存限制:32000kb
这个问题可以用动态规划来解决。假设 $f(n)$ 表示上 $n$ 级台阶的总共方案数,那么有以下转移方程:
$$f(n) = f(n-1) + f(n-2) + f(n-3)$$
因为小明每次可以爬一级、两级或三级台阶,所以到达第 $n$ 级台阶的方案数等于到达第 $n-1$ 级、第 $n-2$ 级和第 $n-3$ 级的方案数之和。
边界条件为 $f(1)=1, f(2)=2, f(3)=4$。因为到达第一级台阶只有一种方案,到达第二级台阶有两种方案(一次爬一级或爬两级),到达第三级台阶有四种方案(一次爬一级、一次爬两级、一次爬三级或先爬一级再爬两级)。
代码实现如下: