蓝桥杯题目《39级阶梯》

小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

站在台阶前,他突然又想着一个问题:

如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?

这个问题的突破口就是找到是怎么产生的这个结果,什么结果? 就是这个最后一步是右脚是怎么产生的,经由这样的产生我们可以通过动态规划算法来去解决这个问题。

由问题入手,不是说每一步只能迈上1个或2个台阶吗,而要推出有多少种不同的上法。而约束条件是先迈左脚且最后一步是迈右脚

如果xi:表示符合问题的所有的上法
好,那么我们都够得出如果是只有一个台阶的话是不能满足条件的。即x1=0,那么第二个台阶是通过暴力分析法都够得出x2=1。那么x3?

刚才说过只要能找到问题的突破口,即登上最后的阶梯的这个右脚是怎么产生的呢。这个很简单,是因为xi-1是左脚先迈上的,即前一阶是左脚先迈上的,以及xi-2也是左脚先迈上的,即前第二阶也是左脚先迈上的。为什么呢?

这是因为在这种情况下,直接迈右脚就可以直接到达最后一阶。符合问题的条件。

也就是说x3是要x1的仅是左脚的上法+x2的仅是左脚的上法(仅是左脚的上法意思就是迈上这一阶台阶的时候,是先迈的左脚。我们只考虑在这一阶台阶迈左脚的情况,而不考虑会有迈右脚的情况)

我们通过暴力分析法分析下:
第一阶不用考虑直接迈左脚,所以只有1种上法。
上第二阶,可以通过左脚迈上第一阶,右脚迈上第二阶;左脚跨两阶迈上第二阶,就这两种。而在这种情况下,仅左脚迈上第二阶的是1种,仅右脚(符合问题)的也是1种
而第三阶经由分析能够推出来符合问题就只有2种,满足刚刚得出的假设。

那么接下来如果得到仅左脚的上法。可以仿照上面想的,仅左脚的前提不就是在前一阶或者前第二阶是仅右脚迈上的所有的上发。

所以我们可以这样的得出递推方程:
令x[i]:仅考虑在第i阶的阶梯中右脚的上法(符合问题的,也就是问题所考虑的情况)
y[i]:仅考虑在第i阶的阶梯中左脚的上法
x[i]=y[i-1]+y[i-2]
y[i]=x[i-1]+x[i-2]

然而x[1],x[2],y[1],y[2]都是可以通过问题分析得到。那么从第3阶开始逐步通过动态规划算法来得出,直至第39阶

根据这样的思路来写代码:

package com.lanqiaomain;

/**
 * 利用动态规划算法解决此问题,递推方程:
 * 仅右脚登上第n阶的总共的次数=第n-1阶仅左脚登上阶梯的次数+第n-2阶仅左脚登上阶梯的次数
 * 然而第n阶仅左脚登上阶梯的次数=第n-1阶仅右脚登上阶梯的次数+第n-2阶仅右脚登上阶梯的次数
 *
 */
public class Main {
	public static void main(String[] args) {
		int n=39;
		int a[]=new int[n];  //保存仅右脚登上阶梯的次数
		int b[]=new int[n];  //保存仅左脚登上阶梯的次数
		
		int num=Stairs(a, b);
		System.out.println(num);
		
	}
	public static int Stairs(int a[],int b[]) {
		a[0]=0;b[0]=1;
		a[1]=1;b[1]=1;
		for(int i=2;i<a.length;i++) {
			a[i]=b[i-1]+b[i-2];
			b[i]=a[i-1]+a[i-2];
		}
		return a[a.length-1];
	}
}

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 用 Java 来计算 100 阶梯有多少种上法,可以使用动态规划的思想,假设 n 阶梯有 f(n) 种上法,那么 f(n) = f(n-1) + f(n-2),当 n = 1 时,f(n) = 1,当 n = 2 时,f(n) = 2,因此,f(100) 的值为 354224848179261915075。 ### 回答2: 解题思路: 本题可以使用递归的方式进行求解。假设我们要到第n阶梯,那么我们可以从第n-1阶梯上来,也可以从第n-2阶梯直接跳上来。所以,我们可以将问题转化为求解第n-1和第n-2阶梯的上法总数之和。 Java代码实现: ```java public class Staircase { public static int climbStairs(int n) { if(n <= 2) { return n; // 当n小于等于2时,直接返回n } int[] dp = new int[n+1]; // 创建一个数组用来保存每一阶梯的上法总数 dp[1] = 1; dp[2] = 2; // 初始化第一和第二阶梯的上法总数 for(int i = 3; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; // 获取第i阶梯的上法总数 } return dp[n]; } public static void main(String[] args) { int n = 100; int result = climbStairs(n); System.out.println("100阶梯的上法总数为:" + result); } } ``` 输出结果: ``` 100阶梯的上法总数为:573147844013817084101 ``` ### 回答3: 要计算100阶梯的上法,可以使用动态规划的方法。我们定义一个数组dp,其中dp[i]表示上到第i阶梯的上法数量。 初始化dp[0]=1,即到达第0阶梯的方法只有一种,就是不上。 然后我们可以根据规则进行递推: - 当i=1时,只有一种上法,即上1阶梯,所以dp[1]=1。 - 当i=2时,有两种上法,可以选择一次上1或者一次上2阶梯,所以dp[2]=dp[1]+dp[0]=1+1=2。 - 当i>2时,dp[i]=dp[i-1]+dp[i-2],因为到达第i阶梯的上法数量等于上到第i-1阶梯的上法数量加上上到第i-2阶梯的上法数量。 使用循环计算dp数组的值,直到计算到dp[100],最后输出结果即可。 以下是使用JAVA代码实现: ```java public class Stairs { public static void main(String[] args){ int n = 100; // 阶梯数 int[] dp = new int[n+1]; // 初始化dp数组 dp[0] = 1; dp[1] = 1; // 计算dp数组的值 for (int i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; } // 输出结果 System.out.println("100阶梯的上法种数为:" + dp[100]); } } ``` 运行上述代码,结果将输出:100阶梯的上法种数为:573147844013817084101。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值