台阶问题

1 问题描述

    1. 楼梯有n个台阶,上楼可以一步上1阶,也可以一步上2阶,一共有多少种上楼的方法?
斐波那契数列  第一项为1 第二项为2 也就是f(n)=f(n-1)+f(n-2),用递归求。
给个分析的例子:
有一个11级的台阶,一个人可走一步也可走两步,问这个人有多少种方法走完这个台阶?
解:
①只用一步走:1+1+1+1+1+1+1+1+1+1+1=11,共11步,只有C11,1=1种走法。
②用了一次两步走:1+1+1+1+1+1+1+1+1+2=11,共10步,有C10,1 =10种走法。
③用了两次两步走:1+1+1+1+1+1+1+2+2=11,共9步,有C9,2 =36种走法。
④用了三次两步走:1+1+1+1+1+2+2+2=11,共8步,有C8,3= 56种走法。
⑤用了四次两步走:1+1+1+2+2+2+2=11,共7步,有C7,4=35种走法。
⑥用了五次两步走:1+2+2+2+2+2=11,共6步,有C6,1=6种走法。
总共有1+10+36+56+35+6=144种
理论上分析:只有一个台阶的话,只有1种走法,2级台阶的话,可以一步一个台阶走,也可以一步2个台阶走,共有2种走法。
当台阶数大于等于3之后,可以这么分析:如果最后一步走一个台阶,那么就是n-1个台阶的走法的种类,如果最后一步走两个台阶,那么就是n-2个台阶的走法的种类,所以n个台阶的走法种类就是n-1个台阶和n-2个台阶的走法的总和。因此,这是一个递归函数。也是一个裴波那契函数。

2 实现

/**
 * 
 * @author xld
 *
 */
public class Solution2 {

    private static int[] memo;

    //原始递归 --时间复杂度O(n^2)
   /* public static  int climbStairs(int n) {
        if(n==0)
            return 1;
        if(n==1)
            return 1;
        return climbStairs(n-1)+climbStairs(n-2);
    }*/

    /**
     * 动态规划
     * @param n
     * @return
     */
    public static  int climbStairs(int n) {
        memo = new int[n+1];
        for(int i=0;i<memo.length;i++)
            memo[i]=-1;
        memo[0]=1;
        memo[1]=1;
        for(int i=2;i<=n;i++){
            memo[i]=memo[i-1]+memo[i-2];
        }
        return memo[n];
    }

    public static void main(String[] args) {
        System.out.println(climbStairs(44));
    }
}
### 动态规划台阶问题中的应用 动态规划是一种通过分解子问题来解决复杂问题的方法[^1]。台阶问题通常可以通过动态规划的思想进行求解,其核心在于将问题分解为更小的子问题,并通过递推关系找到最终解。 #### 问题描述 台阶问题通常可以描述为:给定一个有 `n` 级台阶的楼梯,每次可以选择走 1 级或 2 级台阶,问有多少种不同的方式可以走到第 `n` 级台阶。 #### 解题思路 为了计算到达第 `n` 级台阶的不同方式,可以定义一个数组 `dp`,其中 `dp[i]` 表示到达第 `i` 级台阶的不同方法数。根据题目条件,可以得出以下递推关系: - 如果从第 `i-1` 级台阶走 1 步到达第 `i` 级台阶,则有 `dp[i-1]` 种方法。 - 如果从第 `i-2` 级台阶走 2 步到达第 `i` 级台阶,则有 `dp[i-2]` 种方法。 因此,递推公式为: ```plaintext dp[i] = dp[i-1] + dp[i-2] ``` 边界条件为: - 当 `n=0` 或 `n=1` 时,只有一种方法到达目标台阶,即 `dp[0] = 1` 和 `dp[1] = 1`。 #### 实现代码 以下是基于动态规划思想的 Python 实现代码: ```python def climb_stairs(n): if n == 0 or n == 1: return 1 dp = [0] * (n + 1) dp[0], dp[1] = 1, 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] # 示例调用 n = 5 print(f"共有 {climb_stairs(n)} 种方法到达第 {n} 级台阶") ``` 上述代码中,`dp` 数组用于存储到达每一级台阶的方法数,最终返回 `dp[n]` 即为到达第 `n` 级台阶的所有可能方法数。 #### 优化空间复杂度 由于递推公式仅依赖于前两个状态,因此可以通过两个变量代替整个数组,从而将空间复杂度降低到 O(1)。 ```python def climb_stairs_optimized(n): if n == 0 or n == 1: return 1 prev1, prev2 = 1, 1 for i in range(2, n + 1): current = prev1 + prev2 prev2 = prev1 prev1 = current return prev1 # 示例调用 n = 5 print(f"共有 {climb_stairs_optimized(n)} 种方法到达第 {n} 级台阶") ``` #### 总结 通过动态规划的方法,台阶问题可以被高效地解决。这种方法不仅适用于简单的台阶问题,还可以扩展到更多复杂的场景,例如允许每次走多步台阶或增加额外约束条件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值