童年二三事

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]。

转载于:https://www.cnblogs.com/stackrush/archive/2013/03/07/2949009.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值