LeetCode刷题——爬楼梯

大家好,今天刷到了动态规划类型的题,原先对动态规划具体是什么并没有概念,今天趁机了解了一下。很多人觉得动态规划问题就是递归。但我觉得动态规划问题更应该是状态的定义和状态转移方法的定义。通过初始状态和寻找状态转移方法对一个复杂问题进行拆分。

先看下问题描述:


思路:我最开始不了解动态规划思路的时候想到的是最简单粗暴的排列组合的方法,应该也是对的,但是运行会超时。

也是我的心血,还是放上代码:

class Solution {
public:
    int climbStairs(int n) {
        int result = 0;//输出
        int num = 0;//有几个2
        int res = 0;//判断奇偶
        if(n <= 2)
            return n;
        else{
            while(n/2 != 0){
                num++;
            }
            res = n % 2;
            if(res){
                int temp= 1;//有几个1
                for(int i = num;i >= 0;i--){
                    result += pow((i + 1),temp);
                    temp += 2;
                }
                return result;
            }
            else{
                int temp= 0;//有几个1
                for(int j = num;j >= 0;j--){
                    result += pow((j + 1),temp);
                    temp += 2;
                }
                return result;
            }
        }
    }
};

下面介绍动态规划思想的解题思路:我们假设S(n)表示上n节台阶的方法数。假设我第一步跨1节,则剩下的方法为S(n - 1),假设我第一步跨2节,则剩下的方法为S(n - 2)。而第一步只有1或2节这两个选项,因此我们可以得到S(n) = S(n - 1) + S(n - 2)。这就是状态转移方法,而初始情况为S(1) = 1,S(2) = 2.这就与斐波那契数列的演变相契合。我们就可以依照此,进行递归。

代码如下:

class Solution {
public:
    int climbStairs(int n) {
        int result;
        if(n <= 2)
            return n;
        else{
            int a = 1;
            int b = 2;
            result = 0;
            for(int i = 3;i <= n;i++){
                result = a + b;
                a = b;
                b = result;
            }
        }
        return result;
    }
};
动态规划的题目思路很重要,还有很多要学习的,我们下期见!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值