爬楼梯问题是一道典型的递归问题和动态规划问题的入门级题目。题目描述是:给定一个n个台阶楼梯,每次可以上一个或者两个台阶,请问最终可以有多少种方法爬到顶层。使用递归的思路解决是,到达第K个楼梯的方法数目是到达地k-1个楼梯的方法数与到达地k-2的楼梯的方法数的和。所以,如果函数原型是int cal(int n),那么我们可以得到递归规则是cal(k)=cal(k-1)+cal(k-2)。边界条件是cal(1)=1,cal(2)=2。但是,这样计算会有很多的重复性计算,所以可以使用动态规划来解决。如果使用一位数组ways来存储到达第k个楼梯的方法数,那么ways[k+1] = ways[k]+ways[k-1];从0一直结算到n,可以避免很多的重复计算。该题目是leetcode上OJ的题目,也是CtCI的原题的变形。下面是给题目的Java实现。
public class Solution {
/**
* You are climbing a stair case. It takes n steps to reach to the top.
* Each time you can either climb 1 or 2 steps. In how many distinct
* ways can you climb to the top?
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Solution().climbStairs(10));
}
public int climbStairs(int n) {
// Start typing your Java solution below
// DO NOT write main() function
if(n < 0)
return 0;
int[] ways = new int [n+1];
ways[0] = 1;
ways[1] = 1;
for(int i = 2; i < n+1; i++){
ways[i] = ways[i-1]+ways[i-2];
}
return ways[n];
}
}