动态规划经典题目 爬楼梯

要是还看不懂为啥是 f[n]=f[n-1]+f[n-2]我就去给三国杀刷好评

题目:

从楼梯第0阶开始网上爬,一次可以爬1阶或者2阶,刚好到达第n阶有多少种爬法

这是动态规划最经典的一题,如果只有1阶,那么就只有1种方法,从0到1,如果是两阶,则有两种方法,1+1或者2

我们把前n阶的和记作f[n],其中f[1]=1,f[2]=2,如果是到达第5阶,首先前4阶的方法肯定都能用,因为到达第4阶只能爬1阶到达5阶,所以f[5]+=f[4],f[5]不可能小于f[4],也可以在f[3]时1步2阶跳到5阶,所以f[5]+=f[3],最后得出f[5]=f[4]+f[3],f[n]=f[n-1]+f[n-2]

        public int climbStairs(int n) {
            int[] f = new int[n + 1];
            f[0] = 1;
            f[1] = 1;
            if (n < 2) {
                return f[n];
            } else {
                for (int i = 2; i <= n; i++) {
                    f[i] = f[i - 1] + f[i - 2];
                }
            }
            return f[n];
        }

那可能就有人和我一样好奇为啥是这个结果了,比如f[4]只有1中方法跳到5阶,f[3]有两种方法跳到5阶,结果不应该再加1吗?

这个想法把我囚禁了一个下午,理解起来很简单,f[3]虽然有两种方法,其中1种方法是3+1+1=5,而其中的3+1=4已经在f[4]里了,所以也只有一种3+2=5了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值