2018-01-30

上台阶问题

问题描述 

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上M级,共有多少走法?其中M取值范围为1~100,结果值需要Mod 1000000007的值。

例如 输入 3 

输出 2

输入 100 

输出687995182

解决思路

刚开始看到这道题的时候也没看明白,后来在网上找了一下,看到了f(n)=f(n-1)+f(n-2)这个方法也就是斐波那契数列,也就是到n这个台阶的走法等于到n-1个台阶的走法个数加上到n-2个台阶的走法格式,比如n=3时的走法就等于走到第一个台阶的方法个数加上走到第2个台阶的方法个数(注意,刚开始你在第一级,不是在第0级)。

我们可以采用动态规划的方法求解。

首先定义一个数组来保存计算的数值

int[] data=new int[n+1];

定义一个循环来对该数列进行赋值,因为f(n)=f(n-1)+f(n-2),所以我们只需要知道n=2和n=3的计算数值就可以计算出后面的方法个数

for(int i=1;i<=n;i++) {

if(i==1) {

data[1]=0;

}

else if(i==2) {

data[2]=1;

}

else if(i==3) {

data[3]=2;

}

else {

data[i]=(data[i-1]+data[i-2])%1000000007;

}

}

定义一个方法将上面的代码写入并返回data[n]的数值。然后在主函数中直接调用输出即可。

完整代码如下:

import java.util.*;

public class ShangLouTi {

static Scanner cin=new Scanner(System.in);

static int n=cin.nextInt();//台阶数

public static void main(String[] args) {

System.out.println(zoufa(n));

}

public static int zoufa(int n) {

int[] data=new int[n+1];

for(int i=1;i<=n;i++) {

if(i==1) {

data[1]=0;

}

else if(i==2) {

data[2]=1;

}

else if(i==3) {

data[3]=2;

}

else {

data[i]=(data[i-1]+data[i-2])%1000000007;

}

}

return data[n];

}

}


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,357评论 0 33
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 5,955评论 0 2
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,752评论 0 38
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,858评论 18 399
  • 1、IOS8之后有的方法写到类里强制横屏之后已经没有用了 2、IOS8之后该怎么实现强制横屏 首先在代理类实现该方...
    浮浅丶Superficial阅读 3,655评论 0 2

友情链接更多精彩内容