动态规划-爬楼梯

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

分析这道题从基础开始,若是只有一层台阶那只有一种选择,因此f(n)=1,当有两层台阶时我们可以选择一步或两步,因此f(n)=2,当有三个台阶时呢,最后一步一定是从第二个台阶或第一个台阶迈过来,换句话说也就是,有三个台阶时,f(n)=f(1)+f(2),由此我们可以推导出f(n)=f(n-1)+f(n-2) (n>2)
因此可以采用递归的思想
java代码

class Solution {
    public int climbStairs(int n){
        if(n==1) f[n]=1;
        else if(n==2) f[n]=2;
        else{
           f[n]=f[n-2]+f[n-1]
        }
        return f[n];
    }
}

但是我们看一下递归树
以
递归树中2已经递归过了但是又递归了一遍,这是重复递归,优化它,我们采用递归+记忆的办法(这里有前提,子问题的相关性应该是循环的,否者我们将得到无限)我们采用一个memo数组去记录,若是已经递归了则不进行重复作业
java代码

class Solution {
    public int climbStairs(int n) {
     int memo[]= new int[n+1];
     return climbStairsMemo(memo,n);
    }
    public int climbStairsMemo(int memo[],int n){
        if(memo[n]>0) return memo[n];
        if(n==1) memo[n]=1;
        else if(n==2) memo[n]=2;
        else{
            memo[n]=climbStairsMemo(memo,n-1)+climbStairsMemo(memo,n-2);
        }
        return memo[n];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值