迷路


私信TA

用户名:H2030819048

访问量:531

签 名:

等  级
排  名 1186
经  验 3114
参赛次数 16
文章发表 1
年  龄 0
在职情况 学生
学  校 宿舍呆瓜
专  业

  自我简介:

TA的其他文章

解题思路:方法一:递归思路; 因为从m往下走的时候只有两种选择,要么下一要么下二,可以理解为f(m) = f(m-1) +f(m-2),

所以要求f(m)只需求出 f(m-1) 和f(m-2),然后依次往下递归,直到m<=2的时候就意味着只有一种方法也就是只能下一格楼梯,因为如果m>2的时候还可以选择是下一还是下二。但是如果m大一点的话f(m) 往下分的f(m-1) +f(m-2)会越来越多,因此可能会超时的捏(个人觉得而已)。****(如果不是张叔叔强制要求要用递归加函数来解题目的话)****


方法二三:如下代码


2)注意事项:

参考代码:

package dotcppTest1;

import java.util.Scanner;

/**  方法一:递归
* @author 迷路的年轻人
* @create 2021-11-10 23:02
*/
public class Main {
   private static int getMethod(int m){
       return m <= 2 ? 1: getMethod(m - 1) + getMethod(m - 2);
   }
   public static void main(String[] args){
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt();
       while(n-->0){
           int m = scan.nextInt();
           System.out.println(Main.getMethod(m));
       }
   }
}




package dotcppTest1;

import java.util.Scanner;

/**方法二:动态转化

其实仔细观察一下也还是可以看出来,这玩意的规律也就和那个斐波那契数列的规律一毛一样,大概如下:

楼梯数:1 2 3 4 5 6 7 

方法数:1 1 2 3 5 8 13


由上规律就可以用动态转化来解决捏

只需要用3个整型变量记录位置就行

假设要求楼梯为6的方法数,a,b,c,的位置如下

未转化前


楼梯数:1 2 3 4 5 6 7 

方法数:1 1 2 3 5 8 13

                   a b c

转化后


楼梯数:1 2 3 4 5 6 7 

方法数:1 1 2 3 5 8 13

                      a b c


也就是说在c = 6的时候只需要把前面两个 a 和 b指向的方法数加起来就行,就是c每次向右转移的时候ab跟着一起走


* @author 迷路的年轻人
* @create 2021-11-10 23:11
*/
public class Main1 {
   public static void main(String[] args){
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt();
       while(n-->0){
           int m = scan.nextInt();// a b c
           int a=0,b=0,c=1;//         1 2 3
           for(int i=1;i<m;i++){//0 0 1 1 2 3 5 8 13
               a=b;
               b=c;
               c=a+b;
           }
           System.out.println(c);
       }
   }
}

方法三:斐波那契数列的通项公式

由上规律可以知道,其实直接用斐波那契数列的通项公式就可以直接求出来,什么都不用思考,套就完事了

package dotcppTest1;

import java.util.Scanner;

public class Main2 {
   public static void main(String[] args){
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt();
       while(n-->0){
           double m = scan.nextDouble();
           double sqrt_f = Math.sqrt(5);
           double ans = Math.pow((1+sqrt_f)/2,m)-Math.pow((1-sqrt_f)/2,m);
           int ending =(int)(ans/sqrt_f);
           System.out.println(ending);
       }
   }
}



 

0.0分

2 人评分

  评论区

  • «
  • »