题目

类型:动态规划

难度:简单

爬楼梯 - 图1

解题思路

方法一:动态规划

f(x)=f(x−1)+f(x−2)

意思是爬到第 x 级台阶的方案数是爬到第 x - 1级台阶的方案数和爬到第 x−2 级台阶的方案数的和。因为每次只能爬 1 级或 2 级,所以f(x) 只能从 f(x - 1) 和 f(x - 2)转移过来,而这里要统计方案总数就需要对这两项求和。

方法二:通项公式

根据 f(x)=f(x−1)+f(x−2) 可以推导公式

爬楼梯 - 图2

代码

方法一:

  1. class Solution {
  2. public int climbStairs(int n) {
  3. int p = 0, q = 0, r = 1;
  4. for (int i = 1; i <= n; ++i) {
  5. p = q;
  6. q = r;
  7. r = p + q;
  8. }
  9. return r;
  10. }
  11. }

方法二:

  1. public class Solution {
  2. public int climbStairs(int n) {
  3. double sqrt5 = Math.sqrt(5);
  4. double fibn = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);
  5. return (int) Math.round(fibn / sqrt5);
  6. }
  7. }