【LeetCode-动态规划】Climbing Stairs【较重要:含dp解题思路套路】

本文解析了一个经典的动态规划问题——爬楼梯。通过分析不同步数到达顶部的方法数量,使用动态规划方法得出解决方案。并给出了详细的代码实现及思路分析。

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.


Example 1:

Input: 2
Output:  2
Explanation:  There are two ways to climb to the top.

1. 1 step + 1 step
2. 2 steps

Example 2:

Input: 3
Output:  3
Explanation:  There are three ways to climb to the top.

1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
class Solution {
public:
    int climbStairs(int n) {
        int dp[n+1];
        for(int i=0;i<=n;i++)
        {
            if(i==0)
            {
                dp[i]=0;continue;
            }
            if(i==1)
            {
                dp[i]=1;continue;
            }
            if(i==2)
            {
                dp[i]=2;continue;
            }
            dp[i]=dp[i-1]+dp[i-2];   //到了第i步有多少种不同走法总数取决于跨一步前的走法数+跨两步前的走法数
            
        }
        return dp[n];
    }
};

大致思路:

动态规划!!!我觉得还是一个思路问题吧!!!

首先,你看这种题干,一去想它是不是可以拆解成同规模子问题的,好像是可以的,因为不管你走多少步,每次都同性质——有自己的不同走法总数,二去想它子问题和父问题的关联,子问题如何决定父问题——如代码中红字。

那么关键就是你如何书写动态规划的状态转移方程——首先①dp数组的值代表的是所求,那么值代表的就是不同走法总数。然后②它是一维还是二维,下标代表什么呢?emmm这道题应该是一维,下标代表步数。③子问题和父问题的关联表示  ④临界条件的设置

问题迎刃而解了,dp[i]=dp[i-1]+dp[i-2],再把临界方程写好,从小到大遍历(因为这不是递归,注意区别——递归是直接调用让它自己回到临界条件,而动态规划是要从临界条件出发,一步步把子规模的问题求好了,最后求到大问题也就是所求)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值