动态规划---台阶问题

问题:

        根据上一章,猿人首领运用了自己的聪明才智分配完所有的猎物后理所当然的收获了族人们的敬佩,在这一天,猿人工程师发明了楼梯,首领得知后带着族内的孩子去看看到底是怎么个事,

到了地方孩子们好奇地在楼梯上爬来爬去,首领和工程师看到了十分欣慰,便一起给孩子们出了个问题,问题是,假设我们一次可以走一节台阶,或者是两节台阶,如果我告诉你们台阶的总数,你们能不能求出爬到楼梯的终点有几种走法吗?这个问题把孩子们难住了,过了整整两天,首领最小的孩子和工程师的长子一起给出了答案。

解法:

       现在各位拿出纸笔: 首领的孩子和工程师的孩子一开始假设只有三个台阶,他们想无论有多少台阶,爬到第一节台阶的方案数肯定是1,因为最少也要爬一次。爬到第二节台阶的方案数肯定是2。因为可以一次爬两节台阶,或是先爬一节再爬一节。

        假设我们站在第三节台阶,我们要想到达第三节台阶,肯定只能从第二节台阶和第一节台阶上来。所以,假设我们站在第二节,要到第三节,只能走一步,所以从第二节到达第三节的方案数等于到达第二节的方案数,假设我们站在第一节,到达第三节有两节距离,如果向上爬一节则会出现一个问题,因为我们已经假设完从第二节到第三节的方案数了,所以会重复,如果不想重复,只能从第一节一次走两节,所以到达第三节的方案数是到达第一节和第二节的方案数之和,即有三种方案,以此类推。

大家是不是发现了一个规律,没错,类似于斐波那契数列。

具体代码:

#include<stdio.h>
int main(void)
{
    int n;
//假设有n节台阶。
    scanf("%d", &n);
    int arr[100] = { 1,2 };
//提前写出达到第一节和第二节的方案数。
    if (n <= 2)
        printf("%d", arr[n - 1]);
//如果台阶数不超过两节,直接打印方案数。
    else
    {
        for (int i = 2; i < n; i++)
            arr[i] = arr[i - 1] + arr[i - 2];
//如果超过两节,每节的方案数等于前两节方案数之和。
        printf("%d", arr[n - 1]);
    }

    return 0;
}

如下图,第一行是输入,第二行为输出。

难点:

重点要注意重复路径问题。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值