思路:
爬楼梯是一个特别经典的动态规划题,动态规划最好的办法就是从递归改到动态规划。
比如现在n阶楼梯,每次爬1阶或者2阶,一共有多少种方法。那么我就可以全排列,比如当前我可以走一阶算一下有多少种方法,然后我可以走两阶有多少种方法,然后想加就得到了最终方法数量。 但是其中是有重复计算的,比如每次都是要重复计算从当前阶到最后一阶的种类数。如果将之前的记录下来,是不是就可以提高效率了,这个就是递归。
首先递归的实现方式如下:
public static int climbStairs01(int n) {if (n<=0){return 0;}return process(0,n);}private static int process(int index, int n) {if (index==n){return 1;}if (index>n){return 0;}//走一步int p1=process(index+1,n);int p2=process(index+2,n);return p1+p2;}
这里计算时候就是在重复计算,这个就是我说的浪费。如果利用之前的计算不再进行重复计算那么就是动态规划。
动态规划代码如下:
public static int climbStairs(int n) {if (n<=0){return 0;}if (n==1||n==2){return n;}int[] dp = new int[n + 1];dp[1]=1;dp[2]=2;for (int i = 3; i <=n; i++) {dp[i]=dp[i-2]+dp[i-1];}return dp[n];}