思路:
爬楼梯是一个特别经典的动态规划题,动态规划最好的办法就是从递归改到动态规划。
比如现在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];
}