爬楼梯--每次只能走一步或者两步,但是不能连续走两步

问题描述
爬楼梯–每次只能走一步或者两步,但是不能连续走两步
在这里插入图片描述
结合上面的图形
如果用户的楼层大于了2的话,
走的方式就分为了两种,第一次走一步或者第一次走两步,当用户走一步的话,下一次的走法就有:走一步或者走两步;当用户走了两步的话,下一次的走法就只能走一步

function climbStairs(n, status) {
    if (n < 0)
      return 0;
    if (n == 1)
      return 1;
    if (n == 2) { 		//当用户的阶梯只剩下2的时候,就需要判断最后一次走的状态(是一步还是两步)
      if (status == 1 || status == 0 ) {			//当状态是1或者是0的话,剩余的走法就还有两种(分别走两步和一次性走两步)
        return 2
      }
      if (status == 2) {			//当状态是2的话,剩余的走法就只有一种(走一步)
        return 1
      }
    }
    if (n > 2) {		//当阶梯大于2的时候
      if (status == 0) {		//状态为0的时候,就相当于是如图中的底层,分为两个方向相加f(n-1)和f(n-2),但是需要将本次走的状态传递过去(需要使用递归,自己调用自己)
        return climbStairs(n - 1, 1) + climbStairs(n - 2, 2)	
      }
      if (status == 1) {			//状态为1的时候,就相当于是如图中的底层的左边部分,又是分为两个方向相加f(n-1)和f(n-2),同样需要将本次次走的状态传递过去
        return climbStairs(n - 1, 1) + climbStairs(n - 2, 2);
      }
      if (status == 2) {		//状态为2的时候,就相当于是如图中的底层的右边部分,这里就只能有一种的走法了,所以递归过去的值就只剩下了f(n-1)
        return climbStairs(n - 1, 1);
      }
    }
  }
  console.log(climbStairs(7, 0))
爬楼梯问题是一个经典的动态规划问题,通常它描述的是一个有n级台的楼梯,每次可以1级或者2级,问有多少种不同的方法可以到顶部。如果增加了不能连续三节台的限制条件,问题就变得更加复杂。 在这种情况下,我们可以定义状态转移方程来解决这个问题。设`dp[i]`表示到达第`i`级台的不同方法数。由于不能连续三节台,所以当我们到达第`i`级台时,我们是从第`i-1`级台1级或者从第`i-2`级台2级到达的,但是由于不能连续三节,所以还需要考虑前一个台法,不能是从第`i-3`级台直接3级到达的。 因此,状态转移方程可以写为: `dp[i] = dp[i-1] + dp[i-2] - dp[i-3]`,其中`dp[i-3]`表示的是因为不能连续三节而需要减去的情况。 初始条件是: `dp[0] = 1`(没有台时默认有一种方法,即不), `dp[1] = 1`(只有1级台,只有一种方法到顶部), `dp[2] = 2`(有2级台,可以2次1级,或者一次2级)。 然后我们可以从第三级台开始计算,一直计算到第n级台的`dp[n]`值。 以下是代码实现的一个例子: ```python def climbStairs(n): if n < 3: return n dp = [0] * (n + 1) dp[0], dp[1], dp[2] = 1, 1, 2 for i in range(3, n + 1): dp[i] = dp[i-1] + dp[i-2] if i > 3: dp[i] -= dp[i-3] return dp[n] # 例如,计算到第5级台的不同方法数 print(climbStairs(5)) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值