第39级台阶(递归+dp)

题目在这里插入图片描述

思路

  1. 这题看起来像兔子数列,但题目说第一步先迈左脚,最后一步是右脚,说明,走楼梯的次数为偶数
  2. 模拟dp过程,观察哪些解不满足
            /*
        1 1
        2  (1,1) (2)
        3  (1,1,1) (1,2)  (2,1)
        4  (1,1,1,1)  (2,2)               (1,2,1) (2,1,1) (1,1,2)

        5   (1,1,2,1)  (1,2,1,1) (2,1,1,1) (1,1,1,2)     (2,2,1) (2,1,2) (1,2,2) (1,1,1,1,1)

         */
  1. 发现走奇数层台阶满足的次数为原来的二分之一

代码

package 蓝桥杯;

public class 走台阶 {
    public static void main(String[] args) {
        // dp[i] 表示走到第i阶用的上法
        int []dp=new int[50];
        dp[1]=1;
        dp[2]=2;
        /*
        1 1
        2  (1,1) (2)
        3  (1,1,1) (1,2)  (2,1)
        4  (1,1,1,1)  (2,2)               (1,2,1) (2,1,1) (1,1,2)

        5   (1,1,2,1)  (1,2,1,1) (2,1,1,1) (1,1,1,2)     (2,2,1) (2,1,2) (1,2,2) (1,1,1,1,1)

         */
        for (int i = 3; i <=39; i++) {
            dp[i]=dp[i-1]+dp[i-2];
        }
        System.out.println(dp[39]/2);

    }
}

(但我们的分析还是不够严谨的,为什么满足的次数为总次数的一半???下面我们将用递归模拟的形式实现)

递归模拟法

package 蓝桥杯;

import java.util.Arrays;
import java.util.LinkedList;

public class 走台阶递归版 {

    static int ans=0;
    public static void main(String[] args) {

        // 左脚为false,右脚为true
        //右脚上去相当于左脚下来
        dfs(39,false);
        System.out.println(ans);
    }
    public  static void dfs(int x,boolean istrue){
        if (x<=0){
            return;
        }
        if ((x==1||x==2)&&istrue==false){
            ans++;
        }
         dfs(x-1,!istrue);
         dfs(x-2,!istrue);
    }
}

解读:

  1. 其实1走到39层,和39走到1层的命题是等价的
  2. 无论先迈哪个脚,只要第一次迈的脚和最后一次迈的脚不同依然满足题意
  3. 我们模拟两种状态,每次递归的过程中变换脚( !istrue 表示脚的状态变换)
  4. 当台阶走到只剩下最后1个或2个台阶时,之后就得走下一步了,走下一步之前脚的状态应该和第一步的状态相同,之后再走一次状态改变才能满足题意(递归终止的条件)

当然答案都是相同的

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值