当前位置: 首页 > article >正文

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

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

  • 509. 斐波那契数
  • 70. 爬楼梯
  • 746. 使用最小花费爬楼梯

509. 斐波那契数

题目链接:509. 斐波那契数,难度:简单
【实现代码】

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

【解题思路】

动态规划五步曲:

  1. 确定dp数组以及下标的含义:dp[i]的定义为:第i个数的斐波那契数值是dp[i]
  2. 确定递推公式:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
  3. dp数组如何初始化:dp[0] = 0; dp[1] = 1;
  4. 确定遍历顺序:从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
  5. 举例推导dp数组

70. 爬楼梯

题目链接:70. 爬楼梯,难度:简单
【实现代码】

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }
        vector<int> dp(n + 1, 0);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

【解题思路】

动态规划五步曲:

  1. 确定dp数组以及下标的含义:dp[i]: 爬到第i层楼梯,有dp[i]种方法
  2. 确定递推公式:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
  3. dp数组如何初始化:本题其实就不应该讨论dp[0]的初始化!dp[1] = 1,dp[2] = 2
  4. 确定遍历顺序:从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
  5. 举例推导dp数组

746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯,难度:简单
【实现代码】

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size() + 1, 0);
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        for (int i = 0; i <= cost.size(); i++) {
            cout << dp[i] << " ";
        }
        return dp.back();
    }
};

【解题思路】

动态规划五步曲:

  1. 确定dp数组以及下标的含义:dp[i]: 爬到第i层楼梯的最小花费
  2. 确定递推公式:状态转移方程 min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);含义是,爬到第i层有两种方式,i-1爬1层或者i-2爬2层,也就是要取dp[i - 1] + cost[i - 1]和 dp[i - 2] + cost[i - 2的最小值
  3. dp数组如何初始化:dp[0] = 0,dp[1] = 0
  4. 确定遍历顺序:从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
  5. 举例推导dp数组

http://www.kler.cn/a/9695.html

相关文章:

  • Linux下MySQL的简单使用
  • 【MySQL】数据库知识突破:数据类型全解析与详解
  • HTMLCSS: 实现可爱的冰墩墩
  • 力扣 LeetCode 977. 有序数组的平方(Day1:数组)
  • C++ | Leetcode C++题解之第556题下一个更大元素III
  • 【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作
  • 20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式
  • WEB系统页面超过一定时间就自动跳转至登录页(或退出)
  • ios jenkins配置实现iOS项目自动化打包
  • 初谈 ChatGPT
  • 【python界面编程】基于tinker界面编程加法
  • 如何降低node 包版本
  • 一文读懂:低代码开发平台对企业效益有什么作用?
  • ant design pro + umi4的动态菜单与动态路由
  • 带你玩转Python爬虫(胆小者勿进)千万别做坏事·······
  • 明明有index.jsp文件访问的时候却显示404
  • 指针C语言基础代码总结
  • 图嵌入 Node2Vec
  • 前端开发必看100道大厂面试题集锦(一)
  • 网站怎么接入chatGPT来自动写文章
  • python【反爬、xpath解析器、代理ip】
  • ZooKeeper领导者选举流程
  • 子集和问题
  • 华为OD机试-通信误码-2022Q4 A卷-Py/Java/JS
  • 【教程】解决VSCode中Python第三方库无法自动补全
  • Segment Anything论文阅读笔记