九度OJ中的变态跳台阶问题解析

大家做高中数学题的时候是否接触过这样一道题:一个青蛙要上一个n阶的台阶,一次可以跳一阶或者是两阶,求得是这只青蛙一共有多少种的跳法。

首先我们要对这个问题进行分析,到底该采用什么样的算法思想去进行解决,这里我们的分析思路可以是如下的:

假设我们已经知道了跳上前n-1阶台阶的数目,那么剩下的唯一一个台阶我们就只有一种跳法,假设我们知道了前n-2阶的跳法数目,那么剩下的2阶台阶就只有两种跳法,这里我们是不是已经知道这里我会采用递归的方式进行解决这个问题,下面附上相关代码,这里的代码上我是假设这只青蛙可以跳三阶的,算法思想是和上面一样,只是递归的跳出条件复杂了点而已。

public static int ClimbStairs(int n)
	{
		if(n == 3)
			return 4;
		else if(n == 2)
			return 2;
		else if(n == 1)
			return 1;
		else 
		return ClimbStairs(n-1)+ClimbStairs(n-2)+ClimbStairs(n-3);
	}
解决了这样一个初始问题我们进行继续分析,大家如果输出不同n的次数时会明显发现这里的n的规律是服从fibonacci数列,这里大家有必要对这个经典数列进行阅读,大家或多或少会接触过这个数列,但是大家是否深入思考过,这里我附上一篇关于fibonacci的博客介绍:

fibonacci数列分析

分析过这样一个问题,我附上相关fibonacci的代码:

public static int demo(int n)
	{
		return (n == 1||n ==0)?1:demo(n-1)+demo(n-2);
	}

下面就可以进入本篇文章的重点内容了,加入这只青蛙被打了兴奋剂,可以一下跳n阶,那么这个问题的所以跳法又会是多少呢?

我们具体的分析思路如下:

如果我们第一次跳1阶,那次数就是跳n-1阶的数目,如果我们跳2阶,那么次数就会是跳n-2阶的数目,经过分析我们会发现:

f(n)=f(n-1)+f(n-2)+f(n-3)+......+f(2)+f(1)+f(0)

其中我们知道f(1)=f(0)=1

下面就是对上面的公式进行算法实现了,具体算法如下:

package jiuduOJ;
import java.util.Scanner;
/**
 * 跳n阶台阶,跳的时候可以一次跳1-n个台阶,这里并没有采用递归的方法进行
*@author:Mr.wang
*@version:1.0
*@time:2015/11/4
 */
public class JumpStair_n
{
	public static void main(String[] args) 
	{
		System.out.println("请输入要爬的总台阶数目n:");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		double[] f = new double[n];
		f[0] = 1;
		f[1] = 1;
		double sum = 2;
		for(int i = 2; i <= n-1; i++)
		{
			for(int j = 0; j <= i-1; j++)
			{
				f[i]+=f[j];
			}
			sum+=f[i];
		}
		System.out.println("所以的爬台阶总数为:"+sum);
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值