Description
Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。
但年幼的他一次只能走上一阶或者一下子蹦上两阶。
现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶共有几种走法。
每组数据包括一行:N(1≤N≤40)。
输入以0结束。
为redraiment到达第n阶不同走法的数量。
#include <cstdio>
#define Maxn 50
int dp[Maxn];
int main()
{
int N;
while(scanf("%d", &N) && N)
{
dp[0] = dp[1] = 1;
for (int i = 2; i <= N; ++i)
dp[i] = dp[i - 1] + dp[i - 2];
printf("%d\n", dp[N]);
}
return 0;
}
思路:利用动态规划求解,定义一个函数表示到达第N阶的走法种数(这里是用dp这个一维数组来实现的,一维数组的每个值用来存放到达第N阶的走法种数)。由题意可知,到达第N阶的走法有两种情况:1、从第N - 1阶跳上来 2、从第N - 2 阶跳上来;因此,到达第N阶的走法种数即是到第N - 1阶的走法种数加上到第N - 2 阶的走法种数。以此类推,因而得到dp[i] = dp[i - 1] + dp[i - 2]。
难点:1、因为1 <= N <= 40,且输出以0结束,可以直接用 while(scanf("%d", &N) && N)来实现;
2、此题的动态规划方程dp[i] = dp[i - 1] + dp[i - 2]。