贪心算法---跳楼梯问题

1.题目

从A点到B点有n阶楼梯,小明现在要从A点到B点,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈三个格子,也可以一步迈四个格子。请编写程序计算小明从A点到B点一共有多少种走法。

2.分析:

我们要求一共有多少种解法,可以先从简单问题入手,贪心策略就是要着眼于局部,找到一个局部最优解法。

先假设:有n阶台阶,n=1,有一种走法

                                   n=2,有两种走法

                                    n=3,有4种走法,直接跨四阶、每次都跨一阶、先跨两阶,再跨一阶、先跨一阶,再跨两阶。

                                     n=4,假设先不考虑这个问题,先以前面三种的情况编写代码。

代码片段,主体思想使用递归

if (n == 1 || n == 2){
            //当n等于前两个台阶时,n是多少就有多少种方法
            return n;
        }
        else if (n == 3){
            return n + 1;
        }

然后考虑问题的角度要变一下,我们在一开始对于台阶具体数量不甚清楚的,但是我们猜测最后台阶剩余的的情况,有可能是剩一阶,两阶,三阶,反正最后肯定是这几种情况,其他的阶数是可以通过这三种组合起来表示的,相当于这三个已经是原子操作了,递归的语句肯定就是这几句了。

要减去用掉的台阶数量,我们只要规定有哪几种会被减去的类型即可,具体被减去的操作交予代码实现,到此可以上机验证一下答案和手算的一致否。

public static long Jumpstairs(int n){

        if (n == 1 || n == 2){
            //当n等于前两个台阶时,n是多少就有多少种方法
            return n;
        }
        else if (n == 3){
            return n + 1;
        }
        
        else {
            return Jumpstairs(n - 3) + Jumpstairs(n - 2) + Jumpstairs(n - 1);
        }
    }

很明显,思路是正确的,答案是正确的。然后再来加入一次可以走四阶这个条件。

原来不加走四阶这个条件时,台阶总数n=4的走法一共有7种,加上之后会变成8种。

上述原子操作也要加上四阶这个情况,根据上述简单的推理,然后得出下述实现代码,

 public static long Jumpstairs(int n){

        if (n == 1 || n == 2){
            //当n等于前两个台阶时,n是多少就有多少种方法
            return n;
        }
        else if (n == 3){
            return n + 1;
        }
        else if (n == 4){
            return n * 2;
        }
        else {
            return Jumpstairs(n - 4) + Jumpstairs(n - 3) + Jumpstairs(n - 2) + Jumpstairs(n - 1);
        }
    }

3.主函数

import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数据组数n:");
        int n = scanner.nextInt();
        while (n > 0){
            n--;
            int tmp;
            tmp =  scanner.nextInt();
            System.out.println("爬上" + tmp + "阶楼梯有" + Jumpstairs(tmp) + "种方法");
        }

    }

链接题目

https://pintia.cn/problem-sets/1633634164392157184/exam/problems/1633634164459266049

链接仓库

筠曦/算法设计与分析基础学习 - 码云 - 开源中国 (gitee.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值