算法——动态规划(新)

什么是动态规划?

动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】-CSDN博客

一、三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode)

思路

我们要知道,走楼梯,前三个阶梯步数已经知道,那我们若是想走到第四楼,还需要一个个推吗?

走到4层,我们有三种方法

1.从一楼出发,这样只需要走3层即可。

2.从二楼出发,这样只需要走2层即可。

3.从三楼出发,这样只需要走1层即可。

所以在此问题中,我们要找到到达n个阶梯时,离n个阶梯最近的n-1,n-2,n-3的阶梯的最短路径。并且以此来递推出走到第n个阶梯的最短距离。

代码

 int waysToStep(int n) {const int MOD=1e9+7;if(n==1||n==2) return n;if(n==3) return 4;vector<int> dp(n+1);dp[1]=1,dp[2]=2,dp[3]=4;for(int i=4;i<=n;i++){dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;}return dp[n];}

二、使用最小花费爬楼梯

LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode)

思路

这也是个动态规划的题目,从底层楼梯爬到最上层,那我们建立表呢?

——设一个dp表,dp[i]表示到第i层需要花费的最少的钱。

由于付一次钱,就可以爬一层或者两层楼梯,所以我们需要比较的是到第i-1层和到第i-2层最小的值————min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) 因此这就是我们的状态转移方程。

状态转移方程就是要把握到达每一步的值从哪里来?——然后比较出最小的那一步的值,依次类推,最后得出到达第i层最小的值。

代码

int minCostClimbingStairs(vector<int>& cost) {int len=cost.size();vector<int> dp(len+1);if(len==1) return cost[0];if(len==2) return min(cost[0],cost[1]);//返回两个中的最小值dp[0]=0,dp[1]=0;for(int i=2;i<=len;i++){dp[i]=min(cost[i-1]+dp[i-1],dp[i-2]+cost[i-2]);}return dp[cost.size()];}

三、解码方法

91. 解码方法 - 力扣(LeetCode)

思路

这里我们知道判断就只有两个,一个是单个数字,一个是两个数字,所以我们也可以按照动态规划的方式,由第n-1个和第n-2个推出第n个的值。

代码

int numDecodings(string s) {int n=s.size();vector<int> dp(n+1);dp[0]=1;for(int i=1;i<=n;i++){if(s[i-1]!='0') dp[i]+=dp[i-1];//单个字母不为0,那么就往上加,一个字母就往前加一个if(i>1&&s[i-2]!='0'&&(s[i-2]-'0')*10+(s[i-1]-'0')<=26) dp[i]+=dp[i-2];//两个字母就加前两个的}return dp[n];}

四、不同路径

LCR 098. 不同路径 - 力扣(LeetCode)

思路

首先,我们知道,只能向右或者向下行走,那么我们可以通过动态规划得出转移方程

dp[i][j]=dp[i][j-1]+dp[i-1][j],其中dp表代表的是到达i处的路径数。

初始化呢?——第一行和第一列都只有1,然后通过状态转移方程即可得出最后一个位置的值,也就是打到终点的路径数。

代码

int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n));if(m==1&&n==1)return 1;for (int i = 1; i < n; i++){dp[0][i] = 1;}for (int i = 1; i < m; i++){dp[i][0] = 1;}for (int i = 1; i < m; i++)for (int j = 1; j < n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1];return dp[m - 1][n - 1];
}

五、不同路径II

63. 不同路径 II - 力扣(LeetCode)

思路

思路和不同路径的思路一样,只不过需要判断障碍物的位置,若是有障碍物,那么就直接将障碍物所在的dp表的值定为0,表明到此位置的路径数为0,无法到达。

代码

 int numDecodings(string s) {int n=s.size();vector<int> dp(n+1);dp[0]=1;for(int i=1;i<=n;i++){if(s[i-1]!='0') dp[i]+=dp[i-1];//单个字母不为0,那么就往上加,一个字母就往前加一个if(i>1&&s[i-2]!='0'&&(s[i-2]-'0')*10+(s[i-1]-'0')<=26) dp[i]+=dp[i-2];//两个字母就加前两个的}return dp[n];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/196305.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AnyLogic 8.8.4:遗传优化和步行电梯 AnyLogic 8.8.5

AnyLogic 8.8.4&#xff1a;遗传优化和步行电梯 2023年7月19日 | 阿纳斯塔西娅日利亚耶娃 新发布行人建模 AnyLogic 8.8.4 现已可供下载。新版本有两个显着特点&#xff1a;内置基因优化和行人图书馆电梯。有关 AnyLogic 8.8.4 中发布的所有改进和更新的更多详细信息&#xf…

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE &#xff08;含2.0以上版本&#xff09;默认库文件位置的方法。 原创文章&#xff0c;转载请注明出处&#xff1a; 【实用技巧】更改ArduinoIDE默认库文件位置&#xff0c;解放C盘&#xff0c;将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…

【开源】基于Vue.js的独居老人物资配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

使用Qt实现多人聊天工作室

目录 1、项目背景 2、技术分析 3、架构设计 3、1 服务器架构 3.1.1 模块划分 3.1.2 模块之间的交互 3、2 客户端架构 3.2.1 模块划分 3.2.2 模块之间交互 4、实现过程 4、1 功能实现 4.1.1 用户登录注册功能​编辑 4.1.2 用户主界面功能 4、2 设计实现 4.2.1 登录…

C语言 深入理解指针

目录 前言 指针的重要概念 剖析 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 **cpp *--*cpp 3 *cpp[-2] 3 cpp[-1][-1] 1 前言 简单来说&#xff0c;指针是一个变量&#xff0c;其值为另一个变量的地址。通过指针&#xff0c;我们可以直…

FPGA实现平衡小车(文末开源!!)

FPGA平衡小车 一. 硬件介绍 底板资源: TB6612电机驱动芯片 * 2 MPU6050陀螺仪 WS2812 RGB彩色灯 * 4 红外接收头 ESP-01S WIFI 核心板 微相 A7_Lite Artix-7 FPGA开发板 电机采用的是平衡小车之家的MG310(GMR编码器)电机。底板上有两个TB6612芯片&#xff0c;可以驱动…

qemu + busybox + 内核实验环境搭建(2023-11)

主要是参考网上的例子&#xff0c;网上的一些例子可能用的busybox 老旧&#xff0c;编译各种问题&#xff0c;以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚&#xff0c;以下是最终完成测试成功的案例。 下载kernel https://cdn.kernel.org/pub/linux/kernel…

python数据可视化

绘制简单的折线图 1.1json数据格式 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据&#xff0c;其本质上是一个带有特定格式的字符串。 主要功能&#xff1a;json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递…

23 - 如何优化JVM内存分配?

JVM 调优是一个系统而又复杂的过程&#xff0c;但我们知道&#xff0c;在大多数情况下&#xff0c;我们基本不用去调整 JVM 内存分配&#xff0c;因为一些初始化的参数已经可以保证应用服务正常稳定地工作了。 但所有的调优都是有目标性的&#xff0c;JVM 内存分配调优也一样。…

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 3

1、下图中&#xff0c;乐乐家的位置用数对&#xff08;4,3&#xff09;表示&#xff0c;学校在乐乐家西南方向。下列选项中&#xff0c;学校的位置不可能是 A、&#xff08;5,4&#xff09; B、&#xff08;2,2&#xff09; C、&#xff08;2,1&#xff09; D、&#xff…

第五篇 《随机点名答题系统》——抽点答题详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.界面设计 3.流程设计 4.关键代码 随机点名答题系统&#xff08;类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统&#xff09;&#xff0c;是基于php&#xff08;8.2.11&#xff09;&#xff0c;Java…

上海亚商投顾:三大指数小幅上涨 HBM概念股全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早盘窄幅震荡&#xff0c;午后集体拉升翻红&#xff0c;黄白二线走势分化&#xff0c;题材热点快速轮…