随想录训练营33/60 | 理论基础;LC 509. 斐波那契数;LC 70. 爬楼梯;LC 746. 使用最小花费爬楼梯

文章介绍了动态规划的五部曲,通过三个具体的LeetCode问题(LC509斐波那契数、LC70爬楼梯、LC746使用最小花费爬楼梯)展示了如何应用动态规划解决编程问题,强调了动态规划在优化递归算法和节省计算时间上的作用。
摘要由CSDN通过智能技术生成

理论基础

动态规划五部曲(类似递归三部曲):

  1. 确定DP数组和其下标含义
  2. 确定递归公式
  3. DP数组如何初始化
  4. 确定遍历顺序
  5. 举例推到DP数组
    动态规划其实也是一种穷举法,但是它将之前的结果保存了,用空间换取了时间。

LC 509. 斐波那契数

题目链接LC 509. 斐波那契数
思路:按着给的公式写就行
代码

class Solution {
public:
    int fib(int n) {
        vector<int> nums;
        nums.push_back(0);
        nums.push_back(1);
        if(n<=1){
            return nums[n];
        }
        for(int i=2; i<=n; i++){
            nums.push_back(nums[i-1]+nums[i-2]);
        }
        return nums.back();
    }
};

LC 70. 爬楼梯

题目链接LC 70. 爬楼梯
思路:从1开始一步一步模拟发现有规律可循。
代码

class Solution {
public:
    //走到1,有1中走法;走到2,有两种走法;走到3可以从1或者2开始走,有1+2 = 3种走法,因为从2开始的包括1+1+1了,所以从1开始到3的只有1+2一种;同样到4有3+2=5种走法
    int climbStairs(int n) {
        vector<int> nums(n);
        if(n<=3){
            return n;
        }
        nums[0] = 1;
        nums[1] = 2;
        for(int i=2; i<n; i++){
            nums[i] = nums[i-1]+nums[i-2];
        }
        return nums[n-1];
    }
};

LC 746. 使用最小花费爬楼梯

题目链接LC 746. 使用最小花费爬楼梯
思路:有一点点的贪心,然后再加上动态规划,到0或1位置时无需花费体力,但是到2时要花费从0到2或者从1到2的体力,两者进行比较取小值;往后是依次累加的。
代码

class Solution {
public:
    //两步以内看谁花费少就走哪里,但是注意第一步不管走一阶还是两阶花费都是0
    //dp[i] = dp[i-1]+cost[i-1]
    //dp[i] = dp[i-2]+cost[i-2]
    //上面是dp的更新公式,哪个小dp[i]就是哪个
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size());
        dp[0] = 0;
        dp[1] = 0;
        for(int i=2; i<dp.size(); i++){
            dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return min(dp[dp.size()-1]+cost[dp.size()-1],dp[dp.size()-2]+cost[dp.size()-2]);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值