题目:
吐槽:1.算一个动态规划的题目,动态规划的题目有一个通用的解体方案:1)写出递归版本。2)写出记忆化搜索的版本3)动态规划版本(就是递归改非递归的方式)。
2.似于斐波纳挈数列.假设梯子有n层,到达n层的时候要么是从n-1层上来的,要么是从n-2层上来的。从n-1层上来只有一种方法,从n-2层上来有2种方法。f(n) = f(n-1)+f(n-2)
代码:
递归版本:
public int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairs(n - 1) + climbStairs(n - 2);
}
记忆化搜索版本:
private static int[] result;
public static int climbStairs(int n) {
result = new int[n+1];
return getResult(n);
}
private static int getResult(int n) {
if(n==1){
return 1;
}
if(n==2){
return 2;
}
if(result[n]==0){
result[n] = getResult(n-1)+getResult(n-2);
}
return result[n];
}
动态规划版本:
public int climbStairs(int n) {
if(n ==1){
return 1;
}
if(n ==2){
return 2;
}
int result1 =1,result2 = 2,result3 =0;
while(n-->2){
result3 = result1+result2;
result1 = result2;
result2 = result3;
}
return result3;
}