假设他初始状态站在第1阶楼梯上,他可以迈上一阶或者两阶楼梯且不会后退,一共有N阶楼梯,他有多少种方法到底第n阶楼梯呢?输入中,只有一个正整数n(0 < n < 100),输出中只有一个正整数表示到达第n节台阶的方案数。用python
时间: 2023-05-30 17:05:14 浏览: 63
实现如下:
n = int(input())
if n == 1:
print(1)
elif n == 2:
print(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]
print(dp[n])
相关问题
Redraiment 小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有 N 阶台阶,请你计算一下 Redraiment 从第 0 阶到第 N 阶共有几种走法。
这似乎是一个组合数学或动态规划的问题,我们可以用动态规划的方法来解决。我们需要定义一个数组 `dp`,其中 `dp[i]` 表示到达第 `i` 阶台阶的不同走法数量。对于每一步,Redraiment 可能选择走一阶(直接上),也可能选择走两阶(跳跃)。因此,如果他在第 `i-1` 阶有 `dp[i-1]` 种走法,那么在第 `i` 阶就有 `dp[i-1] + dp[i-2]` 种走法(因为他可以选择保持不变或者加一跳)。
算法步骤如下:
1. 初始化数组 `dp`,`dp[0] = 1` (从0阶开始有1种走法,就是不移动),`dp[1] = 1` (同理,走到1阶也是1种走法)
2. 对于 `i` 从2到N,`dp[i] = dp[i-2]`,表示走法数等于前一步和前两步的走法之和
3. 最终,`dp[N]` 就是到达第N阶台阶的不同走法数量
下面是对应的 C 语言代码实现:
```c
#include <stdio.h>
int numWays(int n) {
int dp[n+1];
dp[0] = 1; // 到达0阶
dp[1] = 1; // 到达1阶
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i-1] + dp[i-2]; // 动态更新走法数
}
return dp[n];
}
int main() {
int N;
printf("请输入台阶总数: ");
scanf("%d", &N);
printf("从第0阶到第%d阶共有 %d 种走法.\n", N, numWays(N));
return 0;
}
```
写出有一个n阶楼梯,德善每次只能跳一阶或者三阶,但是由于上台阶很费力气而且德善体力不好,所以德善不能连续跳三阶,宝拉姐想知道德善最少需要跳多少次才能恰好跳到第n 阶的代码
这个问题可以通过动态规划(Dynamic Programming)来解决。我们可以创建一个数组 `dp`,其中 `dp[i]` 表示到达第 `i` 阶所需的最小步数。对于每个阶数 `i`,我们有两种选择:
1. 如果德善直接跳一阶,则 `dp[i] = dp[i - 1] + 1`,因为之前已经到了 `i - 1` 阶。
2. 如果德善先跳两阶(由一次跳一阶和一次跳三阶组成),然后跳剩下的 (i - 3) 阶(如果还有剩余的话),则 `dp[i] = min(dp[i], dp[i - 3] + 1)`。
这里使用了 `min` 函数是因为如果之前能通过跳跃达到 `(i - 3)` 阶并加一步到达 `(i - 2)`,那么加上第三步直接跳过 `(i - 2)` 直达 `i` 就更优。
以下是 Python 代码实现:
```python
def climbStairs(n):
if n <= 0:
return 0
dp = [0] * (n+1)
dp[1], dp[2] = 1, 2 # 初始化前两步
for i in range(3, n+1):
dp[i] = min(dp[i-1], dp[i-2]) + 1
return dp[n]
```
阅读全文