跳至主要內容

跳楼梯


跳楼梯

题目

给定一个有n步的楼梯,执行一种方法来计算有多少种可能的方式可以到达楼梯的顶部,给定,每一步你可以走1步,2步,或3步。

题解

暴力解法

class Staircase {

  public int CountWays(int n) {
    if( n == 0)
      return 1; // 基准情况,我们不需要跳任何台阶,因此只有一个选择
      
    if(n == 1)
      return 1; // 需要跳1步台阶,因此只有一步

    if(n == 2)
      return 2; // 一次跳2步,或者跳2次1步的,有2种情况

    // 如果我们走1步,那么剩下的台阶我们要走n-1步;
    int take1Step = CountWays(n-1); 
    // 如果我们走2步,那么剩下的台阶我们要走n-2步;
    int take2Step = CountWays(n-2); 
    // 如果我们走3步,那么剩下的台阶我们要走n-3步;
    int take3Step = CountWays(n-3); 

    return take1Step + take2Step + take3Step;
  }

  public static void main(String[] args) {
    Staircase sc = new Staircase();
    System.out.println(sc.CountWays(3));
    System.out.println(sc.CountWays(4));
    System.out.println(sc.CountWays(5));
  }
}

自顶向下(备忘录)

class Staircase {

  public int CountWays(int n) {
    int dp[] = new int[n+1];
    return CountWaysRecursive(dp, n);
  }
  
  public int CountWaysRecursive(int[] dp, int n) {
    if( n == 0)
      return 1; // 基准情况,我们不需要跳任何台阶,因此只有一个选择
      
    if(n == 1)
      return 1; // 需要跳1步台阶,因此只有一步

    if(n == 2)
      return 2; // 一次跳2步,或者跳2次1步的,有2种情况

    if(dp[n] == 0) {
        // 如果我们走1步,那么剩下的台阶我们要走n-1步;
        int take1Step = CountWays(n-1); 
        // 如果我们走2步,那么剩下的台阶我们要走n-2步;
        int take2Step = CountWays(n-2); 
        // 如果我们走3步,那么剩下的台阶我们要走n-3步;
        dp[n] = take1Step + take2Step + take3Step;
    }
    
    return dp[n];
  }

  public static void main(String[] args) {
    Staircase sc = new Staircase();
    System.out.println(sc.CountWays(3));
    System.out.println(sc.CountWays(4));
    System.out.println(sc.CountWays(5));
  }
}

自底向上

class Staircase {

  public int CountWays(int n) {
    int dp[] = new int[n+1];
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;

    for(int i=3; i<=n; i++)
      dp[i] = dp[i-1] + dp[i-2] + dp[i-3];

    return dp[n];
  }

  public static void main(String[] args) {
    Staircase sc = new Staircase();
    System.out.println(sc.CountWays(3));
    System.out.println(sc.CountWays(4));
    System.out.println(sc.CountWays(5));
  }
}
上次编辑于:
贡献者: Neil