从递归到动态规划之跳楼梯

题目描述

题目 链接(P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

解法一:递归

思路:

首先,确定递归终点和题目要求,递归终点是走到第n阶台阶,题目要求是走到第n阶台阶的走法

然后,确定每次递归完成的步骤,走一步或者两步

最后,确定方法需要携带的数据

        1.当前在第几层:start 2.目标在第几层:end 

代码实现

public class P1255 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ladder(0,n);
    }
    //定义方法,走一步或者两步
    public static void ladder(int start ,int end){
        System.out.println(ladder1(start, end));
    }
    public static int ladder1(int start ,int end){
        if(start == end){
            return 1;
        }

        if(start == end - 1){
            return ladder1(start + 1 , end);
        }
        //定义走一层
        return ladder1(start + 1 , end) + ladder1(start + 2,end);
    }

}

解法二:动态规划

思路:

定义一个dp数组用来记录走每一层的方法数

代码实现:

class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if(n == 0){
            System.out.println(0);
            return;
        }
        BigInteger[] dp = new BigInteger[n + 5];
        dp[1] = new BigInteger("1");
        dp[2] = new BigInteger("2");
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i-1].add(dp[i-2]);
        }
        System.out.println(dp[n]);
    }
}

总结

动态规划是一种空间换时间的算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值