「程序员必须掌握的算法」动态规划「上篇」
动态规划详解
动态规划 (Dynamic Programming) 是一种算法思想,用于解决一些复杂的问题。本文将介绍动态规划的分类、概念和经典例题讲解。
动态规划的分类
动态规划可以分为以下两种类型:
- 0/1背包问题:该问题是动态规划的一种基本类型。在背包问题中,有n个物品可以放入容量为W的背包中,每个物品有自己的重量和价值。需要选择哪些物品能够最大化背包的总价值。
- 最长公共子序列问题:该问题是另一种经典的动态规划类型,涉及到两个字符串,并找到这两个字符串之间的最长公共子序列。
动态规划的概念
在解决动态规划问题时,我们需要定义以下概念:
- 状态 (State):问题中需要优化的变量,如背包问题中的容量,最长公共子序列问题中的字符串长度等。
- 状态转移方程 (State Transition Equation):描述状态之间的转移过程,即问题的递推关系。例如,在背包问题中,每个物品可以放入背包或不放入背包。因此,状态转移方程可以表示为: d p [ i ] [ j ] = max ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i]+v_i) dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi) 其中dp[i][j]表示在使用前i个物品时,填满j容量的背包的最大价值。
- 初始状态 (Initial State):问题的初始条件,通常为问题规模最小的情况下的答案。在背包问题中,初始状态为dp[0][0]=0。
- 边界状态 (Boundary State):问题的边界条件,在状态转移过程中需要特别处理的状态。在背包问题中,背包的容量不能为负数,因此需要在状态转移方程中特别处理。
经典例题讲解
下面我们将分别介绍0/1背包问题和最长公共子序列问题的解法。
1. 0/1背包问题
题目描述:有n个物品和一个容量为W的背包。第i个物品的重量为wi,价值为vi。现在,需要选择一些物品放入背包,使得放入的物品的总重量不超过W,且总价值最大。求最大价值。
解题思路:定义状态dp[i][j]为在使用前i个物品时,填满j容量的背包的最大价值。状态转移方程如下所示: d p [ i ] [ j ] = { d p [ i − 1 ] [ j ] , j < w i max ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) , j ≥ w i dp[i][j] = \begin{cases}dp[i-1][j],&j<w_i\\ \max(dp[i-1][j], dp[i-1][j-w_i]+v_i),&j\ge w_i\end{cases} dp[i][j]={dp[i−1][j],max(dp[i−1][j],dp[i−1][j−wi]+vi),j<wij≥wi 其中dp[i-1][j]表示不放入第i个物品的最大价值,dp[i-1][j-w[i]]+v[i]表示将第i个物品加入背包的最大价值。需要注意的是,如果当前背包容量小于物品的重量,就不能将该物品放入背包。因此,需要特别处理背包容量小于物品重量的情况。
代码实现:
int dp[101][1001];
int weight[101], value[101];int knapSack(int n, int w)
{memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; i++) {for (int j = 1; j <= w; j++) {if (j < weight[i]) {dp[i][j] = dp[i-1][j];} else {dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);}}}return dp[n][w];
}
2. 最长公共子序列问题
题目描述:给定两个字符串A和B,找到它们的最长公共子序列 (LCS)。
解题思路:定义状态dp[i][j]为字符串A的前i个字符和字符串B的前j个字符的LCS长度。状态转移方程如下所示:
d p [ i ] [ j ] = { 0 , i = 0 或 j = 0 d p [ i − 1 ] [ j − 1 ] + 1 , A i = B j max ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) , A i ≠ B j dp[i][j] = \begin{cases}0,&i=0\text{或}j=0\\ dp[i-1][j-1]+1,&A_i=B_j\\ \max(dp[i-1][j], dp[i][j-1]),&A_i\neq B_j\end{cases} dp[i][j]=⎩ ⎨ ⎧0,dp[i−1][j−1]+1,max(dp[i−1][j],dp[i][j−1]),i=0或j=0Ai=BjAi=Bj
当A[i-1]等于B[j-1]时,dp[i][j]等于dp[i-1][j-1]+1,表示A和B中的相同字符加上它们前面的LCS。当它们不相等时,LCS为它们前面的LCS的最大值,即dp[i-1][j]和dp[i][j-1]的最大值。
代码实现:
int dp[1001][1001];
string A, B;int LCS(int n, int m)
{for (int i = 0; i <= n; i++) {for (int j = 0; j <= m; j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else if (A[i-1] == B[j-1]) {dp[i][j] = dp[i-1][j-1] + 1;} else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}return dp[n][m];
}
结语
动态规划是一种非常重要的算法思想,它通常用于解决复杂的问题。在应用动态规划解决问题时,需要注意定义状态、状态转移方程、初始状态和边界状态等概念。对于不同类型的动态规划问题,需要采用不同的解决方法。希望本文能够帮助读者加深对动态规划的理解。
相关文章:
「程序员必须掌握的算法」动态规划「上篇」
动态规划详解 动态规划 (Dynamic Programming) 是一种算法思想,用于解决一些复杂的问题。本文将介绍动态规划的分类、概念和经典例题讲解。 动态规划的分类 动态规划可以分为以下两种类型: 0/1背包问题:该问题是动态规划的一种基本类型。…...
什么是Linux
什么是Linux? 不知道大家是什么时候开始接触Linux,我记得我是大三的时候,那时候通过国嵌、韦东山的教学视频,跟着搭bootloader,修改内核,制作根文件系统,一步步,视频真的很简单&…...
学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义
文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下,设置不分频或者12分频∶Tips:选择不分频还是12分频2.3、定时器的工作模式…...
第28节-PhotoShop基础课程-图层操作
文章目录 前言1.像素图层2.删除 Delete3.合并 Ctrl E4.盖印 Ctrl Shift Alt5.图层顺序-拖动就可以6.编组-Ctrl G 管理图层-分类存放7.锁定图层-背景图层8.不透明度9.查找图层 2.智能图层1.能保持图片放大缩小(Ctrl T)的时候不丢失分辨率2.和滤镜配合使…...
CGAL 闵可夫斯基和(Minkowski Sums)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设给定两个集合 A , B ∈ R d A,B∈R^d A,B...
Layui快速入门之第二节布局容器(固定宽度与完整宽度)
目录 一:固定宽度 二: 完整宽度 一:固定宽度 将栅格放入一个带有 class"layui-container" 的特定容器中,以便在小屏幕以上的设备中固定宽度,让列可控(两侧有留白效果) <!--固定宽度(两侧有留白效果)--&…...
异地容灾系统和数据仓库中数据同步的设计软件的功能模型
( 1)初始同步模块 该模块主要是在表进行初始同步时使用的;它能够根据实际需要生成物化视图 及其索引的创建语句,并完成表的初始同步。如果没有特别的要求,则调用普通初 始同步子模块进行目的端表的初始同步ÿ…...
分布式调度 Elastic-job
分布式调度 Elastic-job 1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算…...
第 2 章 线性表(学生健康登记表实现)
1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…...
第三周晨考自测(3.0)
1.获取元素的偏移量 offsetLeft和offsetTop 分别获取的是元素元素左边的偏移量和上边的偏移量 语法:元素对象.offsetLeft /元素对象.offsetTop 返回值:就是该元素对应的偏移量,是一个具体的数字 offsetLeft:该元素相对于参考…...
C++ 结构体
前文 C中的结构体是一种非常有用的数据类型,它允许我们将不同的变量组合在一起,形成一个自定义的数据结构。 结构体在C中的应用非常广泛,它可以用来表示和管理各种实体、对象或数据的属性。比如,在一个学生管理系统中,…...
如何使用聊天GPT自定义说明
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 OpenAI ChatGPT正在席卷全球。一周又一周,更新不断提高您可以使用这种最先进的语言模型做什么的标准。 在这里,我们深入研究了OpenAI最近在ChatGPT自定义指令上发布的公告。此功能最初以测试版…...
mac pyenv无法切换python版本问题
看是zsh还是bash echo $SHELLzsh 配置到~/.zshrc 文件 vim ~/.zshrcexport PYENV_ROOT"$HOME/.pyenv" command -v pyenv >/dev/null || export PATH"$PYENV_ROOT/bin:$PATH" 执行 source ~/.zshrc bash vim ~/.bashrc export PYENV_R…...
API接口接入电商平台案例,采集淘宝天猫拼多多1688京东LAZADA数据按关键字搜索商品示例
按关键字搜索商品数据API接口可以让用户轻松地在海量商品中找到自己需要的商品。这个接口包括多种搜索方式,例如利用关键字搜索商品名称、商品描述、商品分类、商家信息等。同时,还可以通过不同的排序方式进行筛选,例如销量排行、价格排行、评…...
持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例
2023年8月25日,以“链接云端,可信而安”为主题的“2023首届SecGo云和软件安全大会”在京隆重召开。会上,中国信息通信研究院重磅揭晓了“安全守卫者计划”优秀案例评选结果。 零信任办公安全技术创新企业持安科技,与用户大连万达…...
python28种极坐标绘图函数总结
文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 📊python35种绘图函数总结,3D、统计、流场,实用性拉满 matplotlib中的画图函数,大部分情况下只要声明坐标映射是polar,就都可以画出对应的极坐标图。但…...
C#编程基础(万字详解,这一篇就够了)
C#及其开发环境简介 C#概述 C#的编程功能 C#与.Net的关系 .Net C# C#的集成开发环境 Windows上编写C#程序 Linux/Mac OS上编写C#程序 运行第一个HelloWorld程序 C#基本语法 程序实例 C#基本语法 using关键字 class关键字 注释 成员变量 成员函数 实例化一个类…...
SpringBoot中自定义注解
目录 SpringBoot中自定义注解 关于注解的解释 元注解 Documented Target Retention Inherited Native 自定义注解 自定义注解与SpringBoot全局异常处理完成参数校验 约束验证器 自定义全局异常处理器 自定义注解完成数据脱敏 定义脱敏策略枚举 自定义注解 实行脱…...
《TCP/IP网络编程》阅读笔记--地址族和数据序列
目录 1--IP地址和端口号 2--地址信息的表示 3--网络字节序与地址变换 4--网络地址的初始化与分配 5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类: ① IPv4 表示 4 字节地址族; ② IPv6 表示 16 字节地址族; IPv4 标准的 4 …...
【C++】可变参数模板
2023年9月9日,周六下午 这个还是挺难学的,我学了好几天... 在这里我会举大量的示例程序,这样可以有一个更好的理解, 不定期更新。 目录 推荐文章: 示例程序一:拼接字符串 示例程序二:求整…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
