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

news/2025/3/14 1:11:24/

今天开始动态规划了~   

动态规划的解题步骤

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

斐波那契数

题目链接:力扣

 由于题目给出了递归关系所以这题用递归法也很简单

    int fib(int n) {                //递归if(n<=1)return n;return fib(n-1)+fib(n-2);}

用动态规划:

  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]的,所以遍历顺序为从前往后
  5. 举例推导
int fib(int n)     //动规{if(n <= 1)return n;vector<int>dp(n+1);//初始化数组dp[0] = 0;dp[1] = 1;for(int i=2;i<=n;i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}

 爬楼梯

题目链接:力扣

这题递推关系的推导,在b站评论里看到一个可以秒懂的:

在到达第n层的上一步,我们只有两个选择,走一步,或者走两步。
如果是走一步,我们需要先通过 f(n-1)种方式到达 n-1 层
如果是走两步, 我们需要通过 f(n-2)种方式到达第 n - 2 层
所以综上有 f(n) = f(n-2) + f(n-1)

 这题,如果可以知道递推关系,就会发现和上一题差不多。

  1. 确定dp数组以及下标的含义
    dp[i]: 爬到第i层楼梯,有dp[i]种方法
  2. 确定递推公式
    见上述。
  3. dp数组如何初始化
    dp[1] = 1,dp[2] = 2。
    注意:这里不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样比较符合dp[i]的定义。
  4. 确定遍历顺序
    从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的
  5. 举例推导dp数组
class Solution {
public:int climbStairs(int n) {if(n<=2) return n;vector<int> dp(n+1);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]。
    dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。
    dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。
    由于选择花费最少的,故dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
  3. dp数组如何初始化
    根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],
    同时,题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。”
    也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。
    所以初始化 dp[0] = 0,dp[1] = 0;
  4. 确定遍历顺序
    因为是模拟台阶,而且dp[i]由dp[i-1]  dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
  5. 举例推导dp数组
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {vector<int> dp(cost.size()+1);   //dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。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]);cout<<"dp[" <<i <<"] = " << dp[i] <<endl;}return dp[cost.size()];}};

 


http://www.ppmy.cn/news/425976.html

相关文章

【Mysql】InnoDB 引擎中的数据页结构

InnoDB 是 mysql 的默认引擎&#xff0c;也是我们最常用的&#xff0c;所以基于 InnoDB&#xff0c;学习页结构。而学习页结构&#xff0c;是为了更好的学习索引。 一、页的简介 页是 InnoDB 管理存储空间的基本单位&#xff0c;一个页的大小一般是 16kb。 为了达成不同的目…

EasyExcel实现execl导入导出

引言 在实际开发中&#xff0c;处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库&#xff0c;提供了简单易用的 API&#xff0c;可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能&#xff0c;以及一些相关的技巧和注…

Java SSM框架面试题

sql 中 ${} 和 #{}的区别&#xff1a; #将传入的参数都当成一个字符串&#xff0c;会对自动传入的数据加一个双引号。如&#xff1a;order by #{age}&#xff0c;如果传入的值是18,那么解析成sql时的值为order by “18”, 如果传入 age ,则会解析为 order by “age”将传入的参…

运算符优先级/模板字符串/类型转换

1. 运算符优先级 优先级顺序1()2 -- !3先 * / % 后 -4> > < <5 ! !6先&& 后 ||7 2. 模板字符串中输入变量 模板字符串中可换行&#xff0c;变量放在${}中 3. 数据转换 为什么需要转换&#xff1f; 使用表单&#xff0c;prompt 获取过来的数据默认…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…

Docker容器---Harbor私有仓库部署与管理

Harbor私有仓库部署与管理 一、Harbor概述二、Harbor特性三、Harbor构成四、Harbor构建Docker私有仓库1、部署docker-compos2、下载或上传 Harbor 安装程序3、启动Harbor4、查看Harbor启动镜像5、浏览器访问创建一个新项目6、通过127.0.0.1来登录和推送镜像7、在客户端上传镜像…

Docker容器之harbor私有仓库部署与管理

目录 引言 一、Harbor概述 二、Harbor特性 三、Harbor的构成 四、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署Harbor服务 4、物理机访问server IP 5、添加项目并填写项目名称 6、通过127.0.0.1来登陆和推送镜像 7、其他客户端上传镜像到Harbor …