问题:有一个有着n级台阶的楼梯,从最底下往上走,每一步只能向上1级或者2级台阶,求一共有多少种走法。 例:如图, 到第二级台阶有2种方法, 到第四级台阶有5种方法, 到第六级台阶有13种方法。 数据说明:共十个测试点,1<=级数<=77。
时间: 2024-01-18 22:04:05 浏览: 29
这是一个经典的动态规划问题,可以使用递推的方式来计算。具体方法如下:
定义一个长度为 n+1 的数组 dp,其中 dp[i] 表示到达第 i 级台阶的走法总数。
初始化 dp[1] = 1 和 dp[2] = 2,即到达第一级台阶只有一种走法,到达第二级台阶有两种走法。
然后对于 i > 2,有两种情况:
- 从第 i-1 级台阶走一步到达第 i 级台阶,此时走法总数为 dp[i-1]。
- 从第 i-2 级台阶走两步到达第 i 级台阶,此时走法总数为 dp[i-2]。
因此,dp[i] = dp[i-1] + dp[i-2]。
最终的结果为 dp[n]。
以下是 Python 代码实现:
```
def climbStairs(n: int) -> int:
if n == 1:
return 1
elif n == 2:
return 2
else:
dp = [0] * (n+1)
dp[1] = 1
dp[2] = 2
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
```
输入不同的 n 值,可以得到相应的结果。
相关问题
汉诺塔游戏 (1)有三根桩子A、B、C。A桩上有n个圆盘,最大的一个圆盘在底下,其余圆盘一个比一个小,依次叠上去。 (2)每次只移动一块圆盘,规定小盘的只能叠放在大盘的上面,而大盘不能叠放在小盘的上面。 (3)目标是把所有n个圆盘从A桩全部移到C桩上,如图4-4所示。 试求解n个圆盘从A桩全部移到C桩上的移动次数
汉诺塔问题的移动次数可以用递归的方式求解。假设要将n个圆盘从A移动到C,我们可以将其分成三个步骤:
1. 将n-1个圆盘从A移动到B(借助C);
2. 将第n个圆盘从A移动到C;
3. 将n-1个圆盘从B移动到C(借助A)。
因此,移动n个圆盘的次数等于移动n-1个圆盘的次数加1(移动第n个圆盘的次数)再加上移动n-1个圆盘的次数。
设移动n个圆盘的次数为T(n),则有:
T(n) = T(n-1) + 1 + T(n-1)
化简可得:
T(n) = 2T(n-1) + 1
边界条件为:T(1) = 1。
因此,移动n个圆盘的次数为2^n - 1。
输出斐波拉契数列 斐波拉契(Fibonacci)数列是指这样的数列,其第1、2项都是1,从第3项起,每一项都是前两项的和。例如,底下的数列就是斐波拉契数列的前几项: 1,1,2,3,5,8,13,21,34…… 试编写程序输出斐波拉契数列中指定项: 1.创建一个C程序项目,项目名称应类似“文立斌E”,C语言源文件名称应类似“文立斌.C”,程序应保存在“你的文件夹”内! 2.程序功能及步骤 编写函数fibljb(int n)返回斐波拉契数列中第n项的值,当然,这应该是一个递归函数 编写main函数,提示用户输入两个正整数m和n,然后调用函数fibljb输出介于m和n之间的斐波拉契数,例如m、n分别为3、6时输出2、3、5、8
以下是实现斐波拉契数列的代码:
```c
#include<stdio.h>
int fibljb(int n) {
if(n == 1 || n == 2) {
return 1;
} else {
return fibljb(n-1) + fibljb(n-2);
}
}
int main() {
int m, n;
printf("请输入两个正整数m和n(m < n):\n");
scanf("%d%d", &m, &n);
printf("介于%d和%d之间的斐波拉契数为:", m, n);
int i = 1;
while(fibljb(i) < m) {
i++;
}
while(fibljb(i) <= n) {
printf("%d ", fibljb(i));
i++;
}
printf("\n");
return 0;
}
```
程序中,我们首先定义了一个递归函数`fibljb`,用于计算斐波拉契数列中第n项的值。在`main`函数中,我们提示用户输入两个正整数m和n,并且使用两个while循环来输出介于m和n之间的斐波拉契数。
阅读全文