童年二三事

Description

Redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。 
但年幼的他一次只能走上一阶或者一下子蹦上两阶。 
现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶共有几种走法。

Input
输入包括多组数据。 
每组数据包括一行:N(1≤N≤40)。 
输入以0结束。
 
Output
对应每个输入包括一个输出。 
为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]。

posted @ 2013-03-07 22:47  stackrush  阅读(482)  评论(1编辑  收藏  举报