package dp;
/**
*爬楼梯
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
*
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
*
* 注意:给定 n 是一个正整数。
*
* 示例 1:
*
* 输入: 2
* 输出: 2
* 解释: 有两种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶
* 2. 2 阶
* 示例 2:
*
* 输入: 3
* 输出: 3
* 解释: 有三种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶 + 1 阶
* 2. 1 阶 + 2 阶
* 3. 2 阶 + 1 阶
*
*
* 作者:力扣 (LeetCode)
* 链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn854d/
* 来源:力扣(LeetCode)
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*
* */
public class ClimbStairs {
public static void main(String[] args) {
//int num = climbStairsNew(36);
int num = climbStairsNew2(4);
System.out.println("num "+num);
}
// 4 层
// 1 1 1 1
// 2 2
// 1 1 2
// 1 2 1
// 2 1 1
// 会超时
private static int climbStairs(int n){
if (n == 1 || n== 0) {
return 1;
}
return climbStairs(n-1)+climbStairs(n-2);
}
// 尾递归
private static int climbStairsNew(int n) {
return climbStairsFibonacci(n, 1, 1);
}
private static int climbStairsFibonacci(int n, int a, int b){
if (n <=1) {
return b;
}
return climbStairsFibonacci(n-1, b, a+b);
}
// 这总算是dp 方程吗
// 是的 是一种状态算法 后面算法总数等于前面的算法总数之和,然后依次往前推 知道推导 dp[0]为止
private static int climbStairsNew2(int n) {
if (n <=1 ){
return 1;
}
int[] dp =new int[n+1];
dp[1] = 1;
dp[2] = 2;
for (int i =3; i<=n; i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
}
输出:
num 5