关于DP台阶问题的一点思考(=´ω`=)

今天学习DP的时候忽然将之前困惑了好久的台阶问题想起来了,过去遇到台阶问题只能做到写出递归的程度,但是死活想不到如何简化成公式,突然茅厕顿开,遂记录于此(蹲坑果然是第一生产力(ง •_•)ง)

题目记录如下

  1. 爬楼梯
    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
    每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
    注意:给定 n 是一个正整数。

我们一点一点的分析
首先假设只有一阶楼梯,那就是0-1,这一种爬楼方式
然后假设只有二阶楼梯,那就是0-1-2、0-2,这俩种爬楼方式
再之后假设有三阶楼梯,那就是0-1-2-3、0-2-3、0-1-3这仨种爬楼方式
这时候其实解题思路已经初见倪端了,
0-1-2-3是在0-1-2之后走了一步达到的,
0-2-3是在0-2之后走了一步达到的,
0-1-3是在0-1之后走了两步达到的。
接下来继续,如果是亖阶楼梯,那就是0-1-2-3-4、0-1-2-4、0-1-3-4、0-2-3-4、0-2-4这伍种爬楼方式
①.0-1-2-3-4是在0-1-2-3之后走了一步达到的,
②.0-1-3-4是在0-1-3之后走了一步达到的,
③.0-2-3-4是在0-2-3之后走了一步达到的,
④.0-1-2-4是在0-1-2之后走了两步达到的,
⑤.0-2-4是在0-2之后走了两步达到的。
其中,①②③是由走到第三节台阶的走法演变出来的
④⑤是由走到第亖节台阶的走法演变出来的
所以由此推导,有伍阶楼梯,应该就是3+5 = 8种。
公式就是f(n) = f(n-1)+f(n-2)
其中,f(1) = 1、f(2) = 2
递归就不写了,网上一大把,想抄代码请另寻他处|_•`)
在这里插入图片描述

说笑了,我这种火雷分怎么可能不把代码放出来

    public int climbStairs(int n) {
        int ans = 1;
        int t1 = 1;
        int t2 = 1;
        for (int i = 2; i <= n; i++) {
            ans = t1+t2;
            t1 = t2;
            t2 = ans;
        }
        return ans;
    }

搞定收工─=≡Σ(((つ•̀ω•́)つ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值