【算法】——一键解决动态规划
前言
动态规划是一种高效解决重叠子问题和最优子结构问题的算法思想。它通过分治+记忆化,将复杂问题分解为子问题,并存储中间结果,避免重复计算,从而大幅提升效率。
为什么重要?
- 优化暴力解法:如斐波那契数列,递归复杂度为O(2n),而动态规划可优化至O(n)。
- 解决经典难题:如背包问题、最短路径、编辑距离等,动态规划往往是最优解法。
- 广泛应用:从算法竞赛到实际开发(如资源调度、股票交易策略),动态规划都是核心工具之一。
掌握动态规划,能让你在算法设计与优化中事半功倍!
动态规划流程
我个人是觉得动态规划是相当难的,因为我不太擅长找规律
动态规划就像是我们熟知的找规律,通过已知项得出一个规律
再用这个规律,套用到已知项上,得出未知项
虽然难,但动态规划也有自己的模板,让你看到一个动态规划有个思考方向
动态规划流程
- 创建dp表,确定状态表示
- 确定状态转移方程
- 初始化
- 顺序填充
- 确定返回值
现在,分别介绍一下
创建dp表,并确定状态表示
DP表(动态规划表)是动态规划算法的核心工具。
它本质是一个数组,其中的每一个元素都是一个解
但这个解的意义是未知的,需要我们自己去规定,即解的状态表示
直接地
例如:Fn = Fn-1 + Fn-2
- 我们创建一个dp表,此时dp[i]表示的值就是Fi的值
间接地
例如:求字符串中一个连续的无重复元素子串的最大长度
- 我们创建一个dp表,此时dp[i]表示的值就是以i位置为结尾的无重复元素子串的最大长度
确定状态转移方程
如何从已知的dp[i]得到未知的dp[i],就需要得出状态转移方程
这就是找规律,也是动态规划最难的一部分,得出正确的状态转移方程,是解决问题的关键部分
有些状态转移方程是明着告诉你的,有些则需要自己去找
这一步相当考验你的经验,解决这一步的唯一方法:多练多思考多画图
顺序填充
dp表的数据元素代表解,我们求解问题,就是求出指定dp[i]
用状态转移方程求出dp[i],可能需要dp[i-1]、dp[i-2]等一个或者多个
有了前面,才有后面,因此必须顺序填充
例如:Fn=Fn-1+Fn-2
- 我们求一个dp[i],就需要先知道dp[i-1]和dp[i-2]的长度
初始化
进行顺序填充前,需要先做好准备工作,防止顺序填充的时候遇到错误
例如:Fn = Fn-1+Fn-2
当你填充dp[1]的时候,你就会发现根本没有所谓的F1-2和F1-1,这就是越界错误
我们需要用初始化来避免越界错误
确定返回值
具体情况具体分析,根据题目要求确定返回值,
例如:得出第几项的值
- 这时候直接返回dp[i]即可
再者:求字符串中一个连续的无重复元素子串的最大长度
- 这时候就需要返回最大的dp[i]
动态规划题型
斐波那契数列模型
斐波那契数列就是求出第几个斐波那契数的值
这是最简单的一类动态规划题型,明明白白地告诉你怎么创建dp表,怎么进行状态表示
属于直接明牌了
流程解决:
- 创建dp表:创建一个大小为n+1的dp表,dp[i]表示的值即为F(i)
- 确定状态转移方程:F(n) = F(n-1) + F(n-2)
- 初始化:dp[0]=0,dp[1]=1
- 顺序填充:从左往右依次填充
- 确定返回值:dp[n]表示的值就是F(n)的值,返回dp[n]即可
代码如下
class Solution {
public:int fib(int n) {if(n==0) return 0;if(n==1) return 1;//创建dp表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];}
};
路径问题
求出到达目标地点有多少种方式
这种就是需要自己来找规律了
经典例题:不同路径
流程解决:
创建dp表,确定状态表示
- 有多少个格子,dp表就需要多大,即dp表的大小就是m*n
- 状态表示有个技巧,题目最后要什么,你就表示什么,要求返回抵达最后一个位置的所有路径总数,则dp[i][j]代表的就是这个抵达这个位置的所有路径总数
确定状态转移方程
这里的状态转移方程就没有明示了,需要我们自己去找
但也不难到达一个格子只有两种方式,从正上方的格子下来,从左方的格子过来
而到达当前格子的正上方格子有多种方式,到达左方格子也有多种方式
因此,到达当前格子总路径数 = 到达上方格子的路径数 + 到达右方格子的路径数
状态转移方程:dp[i][j] = dp[i][j-1] + dp[i-1][j]
初始化
- dp[0][0]等于1
顺序填充
- 从左往右,从上往下进行填充
- 填充的时候,需要注意左方格子和上方格子是否存在,进行取舍
确定返回值
- 返回最后一个格子对应的dp[i][j]即可
代码:
class Solution {
public:int uniquePaths(int m, int n) {//创建dp表vector<vector<int>> dp(m,vector<int>(n,0));//初始化dp[0][0]=1;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0 && j!=0){dp[i][j]+=dp[i][j-1];}if(j==0 && i!=0){dp[i][j]+=dp[i-1][j];}else if(i!=0 && j!=0){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}}return dp[m-1][n-1];}
};
简单多状态
在常规动态规划问题中,每个子问题通常只需一个状态表示(如dp[i]
)。但在多状态DP中,每个步骤需要维护多个并行的状态,通过它们之间的关系推导最终解。
典型特征:
- 问题在每个步骤有多种可能的状态(如"持有/未持有股票"、"偷/不偷当前房屋")
- 需要为每种状态单独建立DP表或状态变量
- 状态之间存在相互转移关系
这是我个人问题有点难度的题型,因为你需要考虑多种状态下的状态表示
经典例题:打家劫舍
流程解决:
创建dp表
- 创建dp表,dp表的大小即为给定房屋的个数,即为n
- 状态表示:dp[i]表示偷到当前房屋时的最大金额数
但此时房屋可能被偷,也可能没有被偷!
- 被偷时,该房屋的最大金额数应该加上当前房屋的金额
- 没有被偷时,该房屋的最大金额数则不应该加上当前房屋的金额
而一张dp表,是无法表示偷、不偷两种状态下的值的
因此,需要两种dp表
- dpf表,dpf[i]表示当前房屋被偷后,所获得的最大金额
- dpg表,dpg[i]表示当前房屋没有被偷时,所获得的最大金额
确定状态转移方程
当前房屋被偷
- 相邻的房屋一定没有被偷
dpf状态转移方程:dpf[i] = dpg[i] +nums[i];
当前房屋没有被偷,相邻的房屋可能被偷,也可能没有被偷
- 上一个房屋没有被偷时,状态转移方程:dpg[i] = dpg[i-1];
- 上一个房屋被偷时,状态转移方程:dpg[i] = dpf[i-1]
dpg[i]表示当前房屋没有被偷时的最大金额,因此取两者最大即可
dpg状态转移方程:dpg[i] = max(dpg[i-1],dpf[i-1])
初始化
从开始位置开始
- 偷,dpf[0] = nums[0]
- 没偷,dpg[0] = 0;
顺序填充
- 从左到右,依次填充两个dp表
确定返回值
- 返回最后一个房屋的最大金额即可,即max(dpf[n-1],dpg[n-1])
代码:
class Solution {
public:int rob(vector<int>& nums) {if(nums.size()==0) return 0;//创建dp表int n = nums.size();vector<int> f(n);auto g = f;//初始化f[0]=nums[0];g[0]=0;//顺序填充for(int i = 1;i<n;i++){f[i]=g[i-1]+nums[i];g[i]=max(g[i-1],f[i-1]);}return max(f[n-1],g[n-1]);}
};
子数组问题
子数组问题是动态规划的经典应用场景,通常涉及连续子数组的最优解(如最大和、最长长度等)
子数组问题的DP特点
- 连续性:子数组要求元素连续,与子序列(可不连续)不同
- 单串DP:通常用
dp[i]
表示以第i个元素结尾的子数组的解 - 状态转移:要么延续前一个状态,要么从当前元素重新开始
经典例题:最大子数组和
流程解决:
创建dp表,确定状态表示
- 创建一个大小和数组大小一样的dp表
- 状态表示:dp[i]表示以i位置为结尾的子数组的最大和
确定状态转移方程
连续的子数组,所有下标必须连续,不能间断
- dp[i] = dp[i-1] + nums[i]
子数组可以是多个,也可以是一个,即从当前下标开始
- dp[i] = nums[i]
dp[i]记录的是以i位置为结尾的子数组的最大和,取两者中的最大值
状态转移方程:dp[i] = max(dp[i-1]+nums[i],nums[i])
初始化
- dp[0] = nums[0]
顺序填充
- 从左向右,依次对dp表进行填充
确定返回值
- 我们需要的是该数组的最大子数组和,并不是最后一个位置的最大子数组和
- 所以我们需要找到dp表中的最大值,并返回
代码:
class Solution {
public:int maxSubArray(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];//创建dp表:dp[i]表示当前位置的最大连续子数组和int n = nums.size();vector<int> dp(n);//初始化dp[0]=nums[0];int ret = nums[0];//顺序填充for(int i=1;i<n;i++){dp[i]=max(nums[i],dp[i-1]+nums[i]);if(dp[i]>ret) ret = dp[i];}return ret;}
};
子序列问题
子序列问题是动态规划中的另一大类经典问题,与子数组问题最大的区别在于元素不需要连续。
经典例题:最长递增子序列
流程解决:
创建dp表,确定状态表示
- 创建一个和数组大小一样的dp表
- 状态表示:dp[i]的值表示以i位置为结尾的递增子序列的最大长度
确定状态转移方程
- 递增子序列可以有多个元素,这是元素可以连续,也可以不连续
- dp[i] = dp[j] + 1;
注意:这里的dp[j]可能并不与dp[i]相邻,可以相邻,也可以不相邻,前提是满足nums[j]<nums[i]
- 递增子序列也可能只有一个元素,即当前元素,代表之前没有比其小的元素
- dp[i] = 1
而dp[i]表示的是以i位置为结尾的递增子序列的最大长度
很多人可能会觉得需要在这两者中取最大值
但并不是,这里只能选择符合要求的值
一旦前面没有比当前元素小的元素,那么递增子序列只能重头开始,即长度为1
而如果有,则就需要再在原来的基础长度上加1即可
所以,我们可以在创建dp表的时候,就将所有的dp[i]设置为1
后续如果nums[i]的前面有更小值,直接更新即可!
初始化
- 不需要初始化
顺序填充
- 从左往右依次填充dp表
确定返回值
- 返回dp表中的最大的dp[i]
回文串问题
回文串问题是动态规划的经典应用场景,通常涉及子串/子序列的回文性质判断和最值计算。以下是系统性解题框架和典型例题分析。
回文串问题的DP特点
- 对称性:需判断字符串的对称性质(如
s[i]==s[j]
) - 中心扩展:多数问题可转化为区间DP(从短子串向长子串递推)
- 状态定义:通常用
dp[i][j]
表示子串s[i..j]的回文性质
经典例题:回文子串
思路:
将给定字符串的所有子串进行枚举,并对其每个进行判断是否是回文串
这里的枚举并不是真正的枚举,而是进行一种映射
如:使用[i,j],表示一段区间
流程解决:
创建dp表,确定状态表示
- 根据给定的字符串大小n,创建一个n*n的dp表
- 状态表示:dp[i,j]:表示s中区间为[i,j]的子串是回文字符串
例如:s="abcter"
dp[0][2] 表示"abc"是否是回文字符串
确定状态转移方程
判断 s 的区间[i,j]是否是回文子串
如果 s[i] == s[j] , 则分三种情况进行判断
- i == j,[i,j]代表一个字符,则dp[i][j]=true
- i+1 == j,[i,j]代表两个相邻的字符,则dp[i,j]=true
- i+1 <j,代表不相邻的两个字符相同,接下来看看dp[i+1][j-1]是否是回文字符串
所以,状态转移方程:dp[i][j] = i+1<j?dp[i+1][j-1]:true;
初始化
- 将dp表中的所有元素置为false
顺序填充
- 这里的顺序填充不在是我们正常思维的顺序,而是倒序
- 在状态转移方程中,我们可以发现,求dp[i][j]可能需要dp[i+1][j-1],而dp[i+1][j-1]在dp[i][j]的左下方
- 因此填充顺序是从下到上,从左到右
确定返回值
- 首先设置一个计数器
- 遍历一遍dp表,遇到true就让计数器+1
- 最后返回计数器的值即可
结语
动态规划是一种将复杂问题分解为相互关联的子问题的算法思想,其核心在于利用最优子结构和避免重复计算来提升效率。我们通过定义状态、建立转移方程、初始化边界条件和确定计算顺序这四个关键步骤,可以系统性地解决各类动态规划问题。无论是求最值、处理序列问题,还是解决背包或状态机问题,动态规划都展现出强大的建模能力。记住,许多看似复杂的问题,往往都能通过寻找子问题之间的递推关系来优雅解决。动态规划的魅力就在于它用空间换时间的智慧,让原本可能指数级复杂度的问题变得可解。
相关文章:
【算法】——一键解决动态规划
前言 动态规划是一种高效解决重叠子问题和最优子结构问题的算法思想。它通过分治记忆化,将复杂问题分解为子问题,并存储中间结果,避免重复计算,从而大幅提升效率。 为什么重要? 优化…...
Git使用与管理
一.基本操作 1.创建本地仓库 在对应文件目录下进行: git init 输入完上面的代码,所在文件目录下就会多一个名为 .git 的隐藏文件,该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令(注意要先下载tree插件)…...
npm、nvm、nrm
NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具,允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令: 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如:…...
Java 文件内容转换为MD5哈希值
若要把读取到的 files 列表里的内容转换为 MD5 哈希值,你可以逐个遍历 files 列表中的元素,将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码,展示了如何实现这一功能: import java.io.BufferedInputStream…...
未来郴州:科技与自然的交响诗篇
故事背景 故事发生在中国湖南郴州,描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景,展现雾能转化系统、立体生态书库、智能稻田等创新设计,编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...
UE5 运行时动态将玩家手部模型设置为相机的子物体
在编辑器里,我们虽然可以手动添加相机,但是无法将网格体设置为相机的子物体,只能将相机设置为网格体的子物体 但是为了使用方便,我们希望将网格体设置为相机的子物体,这样我们直接旋转相机就可以旋转网格体࿰…...
Ubuntu系统下的包管理器APT
Ubuntu系统下的包管理器APT 在Linux操作系统生态中,软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版,其强大的包管理系统APT(Advanced Packaging Tool)为开发者与系统管理员提供了便捷的软件生命周…...
超级码科技发布镂空AI保险胶带,重塑包装防伪新标准
在酒类、物流、奢侈品、电子产品等领域,包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用,导致商品被仿冒的风险居高不下。 为此,超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…...
前端通信库fetch-event-source实现丰富的SSE
环境:SpringBoot3.4.0 + Vue3 1. 简介 SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端单向推送实时数据的轻量级协议,配合浏览器原生EventSource API,可实现高效实时通信。前端通过创建EventSource对象订阅服务端流,自动处理连接、重试与数据解析;服务端设置C…...
JVM 中Minor GC、Major GC、Full GC 的区别?
Minor GC、Major GC 和 Full GC 是 Java 虚拟机 (JVM) 垃圾回收 (Garbage Collection) 中的不同类型的 GC 事件,它们在范围、触发条件、停顿时间等方面有所不同。 1. Minor GC (Young GC): 范围: 只针对新生代 (Young Generation) 进行垃圾回收。触发条…...
2747. 统计没有收到请求的服务器数目
文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> countServers(int n, vector<vector<int>>& logs, int x, vector<int>& queries) {sort(logs.begin(), logs.end(), [](vector<int> &a, v…...
设计模式:抽象工厂 - 掌控多产品族的创建之道
一、什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。 核心思想 1.定义多个产品的抽象接口,统一管理具体产品和工厂的创建逻辑。…...
图神经网络+多模态:视频动作分割的轻量高效新解法
一、引言 在智能监控、自动驾驶、人机交互等领域,准确理解视频中的动作序列至关重要。然而,传统方法依赖复杂的视觉模型,计算成本高且难以捕捉长时依赖。近期,一项名为 Semantic2Graph 的研究通过图神经网络(GNN&am…...
技术与情感交织的一生 (五)
目录 初入“江湖” 分工 陌生 CraneOffice 内功 宝典 枪手 回到大二 通关 小聚 唱一首歌 初入“江湖” 分工 软件工作室是坐落在和平区宜昌道的一间民房,和我想象中的公司形象多少有些偏差。天津的道路有点凌乱,初次的时候不太好找…...
简单-快速-高效——模块化解析Pulid(实现不同风格下的人脸一致)
资源 论文:https://arxiv.org/abs/2404.16022 github:https://github.com/ToTheBeginning/PuLID?tabreadme-ov-file comfyui插件:https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced 讲解参考 https://zhuanlan.zhihu.com/p/69684…...
XYZ to xyY 求解
免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济…...
科技自然的协奏曲-深圳
故事背景 故事发生在中国广东深圳的现代城市环境,这里呈现出未来科技与自然生态共生的独特图景。没有具体的角色,却通过多样的场景描绘,展现出未来生活的活力与创新,反映出社会创新与人类情感的紧密结合。 故事内容 在未来的深…...
idea 创建 maven-scala项目
文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1)创建scala目录并标记成【源目录】2)导入scala环境3)测试环境 idea 创建 maven-scala项目 1、创建普通maven项目并且配置pom.xml文件 maven依赖…...
C++项目:高并发内存池_下
目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…...
【UE5】RTS游戏的框选功能+行军线效果实现
目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…...
多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:
RAGFlow 介绍 RAGFlow 是一款基于深度文档理解的开源检索增强生成(RAG)引擎,通过结合信息检索与生成式 AI 技术,解决复杂场景下的数据处理和可信问答问题。其核心设计目标是提供透明化、可控化的文档处理流程,并通过多…...
docker compose安装智能体平台N8N
使用 docker volume create n8n_data 创建了一个名为 n8n_data 的数据卷。你通过 docker run 启动容器,映射了端口 5678,并挂载了 n8n_data 数据卷。 以下是对应的 docker-compose.yml 配置文件: version: "3.7"services:n8n:ima…...
FRP调用本地摄像头完成远程拍照
from flask import Flask, Response import cv2app Flask(__name__)# 基础文字回复 app.route(/) def hello_world():return <h1>你好啊世界</h1><img src"/camera" width"640" /># 摄像头拍照并返回图像 app.route(/camera) def captu…...
【Linux】39.一个基础的HTTP Web服务器
文章目录 1. 实现一个基础的HTTP Web服务器1.1 功能实现:1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现: 总体功能: 提供We…...
蓝桥杯-小明的背包(动态规划-Java)
0/1背包问题介绍 0/1背包问题是经典的动态规划问题,具体描述如下: 解题思路: 输入数据 首先,程序通过 Scanner 从输入中读取数据: n 表示物品的数量。 v 表示背包的最大容量。 接着读取每个物品的重量和价值ÿ…...
(四十一)Dart 中的空安全与 `late` 关键字教程
Dart 中的空安全与 late 关键字教程 空安全简介 空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量是否可能为 null,从而…...
GaussDB使用指南
目录 1. GaussDB 概述 1.1 GaussDB 简介 1.2 核心技术架构 1.3 适用场景与行业案例 2. GaussDB 安装与部署 2.1 环境准备与依赖检查 2.2 单机版安装(Linux) 2.3 分布式集群部署 3. GaussDB 基础操作与语法 3.1 数据库连接与用户管理 3.2 DDL …...
算法训练之动态规划(一)
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
dubbo配置中心
配置中心 简介 配置中心(config-center)在dubbo中可承担两类职责: 外部化配置:启动配置的集中式存储。流量治理规则存储。 Dubbo动态配置中心定义了两个不同层次的隔离选项,分别是namespace和group。 namespace&a…...
移动端六大语言速记:第11部分 - 内存管理
移动端六大语言速记:第11部分 - 内存管理 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在内存管理方面的特性,帮助开发者理解和掌握各语言的内存管理机制。 11. 内存管理 11.1 垃圾回收机制对比 各语言垃圾回收…...
对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?
在Java中,对象的创建方式及其在虚拟机中的具体过程如下: 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式,直接调用类的构造方法。 MyClass obj new MyClass();反射(Reflection) 通过 Class 或 Constructor…...
openwrt软路由配置3
1.启用sftp文件连接 使用ssh连接openwrt时,我发现无法打开sftp windows进行上传和下载文件,提示 sftp channel closed by server: stderr:ash /usr/libexec/sftp-server:not found 原因是系统刚刚装好后,没有安装openssh-sftp-server包 opk…...
C语言for循环嵌套if相关题目
一、题目引入 以下代码程序运行结果是多少? 二、思路解析 进入一个for循环 a<100 进入第一个if b1不大于20为假 进入第二个if b4 a这时a自增为2 当b4时,满足第二个if条件 1.b4,a2 当b7时,满足第二个if条件 2.bb37,a3 当b10时,满足第二个if条件 …...
Redis与Mysql双写一致性如何保证?
我们在面试的时候redis与mysql双写一致性是一个常考的问题,今天我们就一起探讨一下吧 所谓的一致性就是数据的一致性,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性: 这种一致性级别是最符合用户直觉的&…...
STM32 CRC校验与芯片ID应用全解析:从原理到实践 | 零基础入门STM32第九十七步
主题内容教学目的/扩展视频CRC与芯片ID原理实现CRC校验和读取芯片ID为单片机应用提供数据验证和身份识别的功能。 师从洋桃电子,杜洋老师 📑文章目录 一、CRC校验功能解析1.1 CRC基本原理1.2 核心功能对比 二、CRC校验应用实战2.1 典型应用场景2.2 程序实…...
《微服务与事件驱动架构》读书分享
《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版,2020 作者:[加] 亚当 • 贝勒马尔 译者:温正东 作者简介: 这本书由亚当贝勒马尔(Adam Bellemare…...
⼤模型(LLMs)基础
⼤模型(LLMs)基础 ⽬前 主流的开源模型体系 有哪些?prefix Decoder 和 causal Decoder 和 Encoder-Decoder 区别是什么?⼤模型LLM的 训练⽬标 是什么?涌现能⼒是啥原因?为何现在的⼤模型⼤部分是Decoder o…...
IDEA :物联网ThingsBoard-gateway配置,运行Python版本,连接thingsboard,接入 MQTT 设备
准备阶段(教程只针对本地操作,未涉及虚拟机环境) Thingsboard源码编译并运行 没有操作过的小伙伴,可以看我上一篇文章 物联网ThingsBoard源码本地编译篇,超详细教程,小白看过来!_thingsboard…...
面向大模型的开发框架LangChain
这篇文章会带给你 如何使用 LangChain:一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档(以 Python 版为例)模型 I/O 封装…...
每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)
题目描述 小梦有 n 颗能量宝石,其中第 i 颗的能量为 ai,但这些能量宝石十分不稳定,随时有可能发生崩坏,导致他们全部消失! 小梦想要留住宝石们,不希望他们发生崩坏,同时他发现:如…...
写给新人的深度学习扫盲贴:ReLu和梯度
一、ReLU(Rectified Linear Unit,修正线性单元) 梯度是深度学习中最常用的激活函数之一,因其简单、高效且能有效缓解梯度消失问题而被广泛使用。 1. 数学定义 函数表达式: $$ \text{ReLU}(x) \max(0, x) \begin{…...
Spring 框架的核心基础:IoC 和 AOP
一、IoC(Inversion of Control,控制反转) 定义: IoC(Inversion of Control,控制反转),就是把对象创建和依赖关系的管理交给 Spring 容器,而不是由程序员手动去创建对象…...
JavaScript逆向工程实战:如何精准定位加密参数生成位置
前言:一个令人困惑的调试案例 最近在进行某网站的JavaScript逆向分析时,我遇到了一个有趣的现象:当我尝试定位一个名为m的加密参数(值为MTIwMTE3NDQxODk1NTY1NjkA这样的Base64字符串)时,调试器却带我来到了…...
SSM智能停车场管理系统
🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 SS…...
[定位器]晶艺LA1823,4.5V~100V, 3.5A,替换MP9487,MP9486A,启烨科技
Features 4.5V to 100V Wide Input Range 3.5A Typical Peak Current Limit Integrated 500mΩ low resistance high side power MOS. Constant On Time Control with Constant Switching Frequency. 180μA Low Quiescent Current 150kHz/240kHz/420kHz Swi…...
天元证券|A股大反攻!北证50涨超10%!芯片股大爆发
今日,A股全线走强。 科技成长股领涨,北证50指数飙升逾10%,科创50也大涨超4%,深证成指、上证指数午后也稳步拉升涨逾1%。值得注意的是,上证50指数临近收盘集合竞价的时候直线拉升。近4600只个股上涨,成交稳步…...
利用python从零实现Byte Pair Encoding(BPE):NLP 中的“变形金刚”
BPE:NLP 界的“变形金刚”,从零开始的奇幻之旅 在自然语言处理(NLP)的世界里,有一个古老而神秘的传说,讲述着一种强大的魔法——Byte Pair Encoding(BPE)。它能够将普通的文本“变形…...
最新Web系统全面测试指南
你有没有遇到过这样的情况: 系统上线当天,用户频频报错,运维一脸懵逼,开发说“我本地没问题”? 你明明写了几十个测试用例,结果却还是有 Bug 漏网? Web 系统测试,不只是点点点&#…...
OpenBMC:BmcWeb 处理http请求6 调用路由处理函数
OpenBMC:BmcWeb 处理http请求5 检查权限-CSDN博客 检查完权限后,调用了rule.handle(*req, asyncResp, params); template <typename... Args> class TaggedRule :public BaseRule,public RuleParameterTraits<TaggedRule<Args...>> {void handle(const Req…...