青蛙跳台阶青蛙一次可以跳一阶两阶三阶,求跳在第n阶且在第m阶停留过的跳法C语言
时间: 2024-12-18 11:30:48 浏览: 18
在C语言中,解决这个问题通常需要动态规划的方法,可以使用一个二维数组来存储每一步到达的位置和是否停留过。我们定义一个数组`dp`,其中`dp[i][j]`表示到达第i阶并停留在第j阶的跳法数。
算法步骤如下:
1. 初始化:`dp[0][0] = 1`,因为到达第0阶并且停留也是0阶只有一种方式,即不跳。
2. 状态转移:对于每个位置`i`(从1到n),如果`i-j <= 3`,则可以从`j`阶跳到`i`阶,且有两种情况,一是直接跳`i-j`阶,二是先跳`i-j-1`再跳1阶。所以,`dp[i][j] = dp[i - j][j] + dp[i - j - 1][j]`。
3. 结果:最后的答案就是`dp[n][m]`。
以下是C语言的伪代码实现:
```c
#include <stdio.h>
int jump(int n, int m) {
int dp[n+1][4]; // 4 for 0, 1, 2, 3 steps
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
// Dynamic programming
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= 3 && i - j >= 0; ++j) {
if (j == m) {
dp[i][j] += dp[i - j][j];
} else {
dp[i][j] += dp[i - j][j];
}
}
}
return dp[n][m];
}
int main() {
int n = 5, m = 2;
printf("跳到第 %d 阶且在第 %d 阶停留的跳法有 %d 种。\n", n, m, jump(n, m));
return 0;
}
```
阅读全文