代码随想录算法训练营第三十八天|509.斐波那契数、70.爬楼梯、746. 使用最小花费爬楼梯

提示


一、斐波那契数

当前数值等于前两个数值相加

class Solution {
public:
    int fib(int n) {
        //1.确定dp数组及含义
        //2.确定递推公式
        //3.dp数组如何初始化
        //4.遍历顺序
        //5.举例推导递推公式
        if (n <= 1) return n;
        vector<int>f(n+1);
        f[0] = 0;
        f[1] = 1;
        for (int i = 2; i <= n; i++) {
            f[i] = f[i-1] + f[i-2];
        }
        return f[n];
    }
};

二、爬楼梯

1.确定递推公式,爬i-1层楼梯,有dp[i-1]种方法,爬i-2,有dp[i-2]种方法,可以迈一步或者两步到i阶,所以爬到i层有dp[i-1]+dp[i-2]种方法,不是需要迈几步到i阶,而是有几种方法。从i-2层可以迈两步上来,而到达i-2层有dp[i-2]种方法,同理i-1。

class Solution {
public:
    int climbStairs(int n) {
        //1.确定dp数组即下标含义
        vector<int>dp(n+1);
        
        //2.确定递推公式
        if (n <= 2) return n;
        //3.dp数组如何初始化
        dp[1] = 1;
        dp[2] = 2;
        //4.遍历顺序
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

三、使用最小花费爬楼梯

思路类似与爬楼梯,可以选择迈一步或者迈两步,在这道题中,需要求最小花费,所以需要从能到i层的方法中找出花费最少的,也就是min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]).

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //1.确定dp数组及下标含义
        vector<int>dp(cost.size() + 1);
        //2.递推公式

        //3.dp数组初始化
        dp[0] = 0;
        dp[1] = 0;
        
        //4.遍历顺序
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        return dp[cost.size()];
    }
};

总结

楼梯和最小花费爬楼梯有点绕,理解了就好很多。
学习时间90min。
学习资料:《代码随想录》

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值