【C++】动态规划从入门到精通
一、动态规划基础概念详解
什么是动态规划
动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题,并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题:
最优子结构:问题的最优解包含子问题的最优解
重叠子问题:不同决策序列会重复求解相同的子问题
下面用一些例子(由浅入深)了解动态规划
1.1 斐波那契数列递归实现解析
int fib(int n) {if(n <= 1) return n; // 基准条件:F(0)=0, F(1)=1return fib(n-1) + fib(n-2); // 递归分解为两个子问题
}
代码解析:
- 递归终止条件:当n<=1时直接返回n值
- 递归关系:F(n) = F(n-1) + F(n-2)
- 问题分析:计算F(5)需要计算F(4)和F(3),而计算F(4)又需要F(3)和F(2),存在大量重复计算
- 时间复杂度:二叉树结构,O(2^n),空间复杂度O(n)(调用栈深度)
1.2 记忆化递归实现解析
int memo[100] = {0}; // 全局记忆数组,默认初始化为0int fib_memo(int n) {if(n <= 1) return n;if(memo[n] != 0) // 检查是否已计算过return memo[n];return memo[n] = fib_memo(n-1) + fib_memo(n-2); // 计算结果并存储
}
代码解析:
- memo数组存储已计算结果,初始值为0表示未计算
- 每次递归调用前检查是否已有缓存结果
- 通过空间换时间,将重复计算转化为查表操作
- 时间复杂度优化到O(n),空间复杂度O(n)
1.3 迭代法实现解析
int fib_tab(int n) {if(n == 0) return 0;int dp[n+1]; // 创建DP表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数组索引对应斐波那契数列的位置
- 初始化前两个已知值
- 循环从2开始逐步构建后续结果
- 时间复杂度O(n),空间复杂度O(n)(可优化为O(1))
二、经典问题深度解析
2.1 最长公共子序列(LCS)完整解析
问题描述:给定两个字符串text1和text2,返回它们的最长公共子序列的长度
int lcs(string text1, string text2) {int m = text1.size(), n = text2.size();// 创建(m+1)x(n+1)的二维DP表,+1是为了处理空字符串的情况vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for(int i=1; i<=m; ++i) {for(int j=1; j<=n; ++j) {if(text1[i-1] == text2[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[m][n];
}
代码解析:
- 状态定义:
dp[i][j]
表示text1前i个字符与text2前j个字符的LCS长度 - 初始化:第一行和第一列初始为0,表示空字符串的情况
- 状态转移:
- 当字符匹配时:LCS长度+1,继承左上方值+1
- 当字符不匹配时:取上方或左方的最大值
- 遍历顺序:双重循环按行填充表格
- 示例分析:
text1 = “abcde”, text2 = “ace”
DP表最终值为3(LCS为"ace")
2.2 0-1背包问题完整解析
问题描述:给定物品重量数组wt和价值数组val,背包容量W,求能装的最大价值
int knapsack(int W, vector<int>& wt, vector<int>& val) {int n = wt.size();vector<int> dp(W+1, 0); // 一维DP数组优化空间for(int i=0; i<n; ++i) { // 遍历每个物品for(int w=W; w>=wt[i]; --w) { // 逆序更新防止覆盖dp[w] = max(dp[w], // 不选当前物品dp[w - wt[i]] + val[i]); // 选择当前物品}}return dp[W];
}
代码解析:
- 状态定义:
dp[w]
表示容量为w时的最大价值 - 空间优化:使用一维数组替代二维数组
- 逆序遍历原因:保证每个物品只被考虑一次,避免重复使用
- 状态转移方程分析:
- 不选物品i:价值保持dp[w]不变
- 选物品i:价值为dp[w-wt[i]] + val[i]
- 示例分析:
W=4, wt=[2,3,4], val=[3,4,5]
最终dp[4] = max(不选4: dp[4], 选4: dp[0]+5) = 5
2.3 编辑距离完整解析
问题描述:计算将word1转换成word2所需的最小操作次数(插入、删除、替换)
int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));// 初始化边界条件for(int i=0; i<=m; ++i) dp[i][0] = i; // 删除i次for(int j=0; j<=n; ++j) dp[0][j] = j; // 插入j次for(int i=1; i<=m; ++i) {for(int j=1; j<=n; ++j) {if(word1[i-1] == word2[j-1]) { // 字符相同无需操作dp[i][j] = dp[i-1][j-1];} else { // 选择三种操作中的最小代价dp[i][j] = 1 + min({dp[i-1][j], // 删除word1字符dp[i][j-1], // 插入word2字符dp[i-1][j-1]});// 替换字符}}}return dp[m][n];
}
代码解析:
- 状态定义:
dp[i][j]
表示转换前i个字符到前j个字符的最小操作数 - 边界初始化:
- 第一列表示将word1删成空串的操作次数
- 第一行表示将空串插入成word2的操作次数
- 状态转移分析:
- 字符匹配:直接继承左上方值
- 字符不匹配:取三种操作的最小值+1
- 操作类型对应关系:
- 删除:相当于处理word1的前i-1个字符
- 插入:相当于处理word2的前j-1个字符
- 替换:相当于处理i-1和j-1的情况后修改字符
- 示例分析:
word1 = “horse”, word2 = “ros”
最终编辑距离为3(替换h→r,删除 r,删除 e)
三、动态规划优化技巧详解
3.1 斐波那契数列空间优化
int fib_opt(int n) {if(n == 0) return 0;int prev = 0, curr = 1; // 初始值F(0)=0, F(1)=1for(int i=2; i<=n; ++i) {int next = prev + curr; // 计算下一个值prev = curr; // 更新前一个值curr = next; // 更新当前值}return curr;
}
优化原理:
- 观察发现每个状态只依赖前两个状态
- 使用两个变量代替数组存储历史值
- 空间复杂度从O(n)降到O(1)
- 滚动更新机制:
- 每次迭代将prev更新为前一个curr
- curr更新为新的计算结果
3.2 背包问题空间优化
// 二维原始版本
int dp[n+1][W+1]; // 优化为一维数组
vector<int> dp(W+1, 0);
优化原理:
- 二维数组中每一行只依赖上一行的数据
- 逆序更新避免覆盖未使用的旧值
- 关键点:内层循环必须从W到wt[i]逆序进行
- 示例说明:
- 正序更新会导致物品被重复选取(完全背包问题)
- 逆序更新保证每个物品只被考虑一次
四、动态规划解题方法论
4.1 状态定义技巧
-
确定问题变量维度:
- 单序列问题(如LIS):一维状态dp[i]
- 双序列问题(如LCS):二维状态dp[i][j]
- 带约束问题(如背包):二维状态dp[i][w]
-
常见状态定义模式:
- “前i个元素…”:如dp[i]表示前i个元素的最优解
- “以第i个元素结尾…”:如最长递增子序列问题
- “位置(i,j)…”:如矩阵路径问题
4.2 状态转移方程建立
-
分析子问题关系:
- 如何从较小规模的子问题推导当前问题
- 举例:在编辑距离中,三种操作对应三种子问题转移路径
-
方程建立步骤:
(1) 列出所有可能的决策选项
(2) 计算每个决策对应的子问题解
(3) 选择最优决策并组合结果
4.3 初始化技巧
-
边界条件处理:
- 空字符串/空集合的处理
- 初始值的物理意义(如背包容量为0时价值为0)
-
特殊值初始化示例:
// 矩阵路径问题初始化第一行和第一列 for(int i=0; i<m; ++i) dp[i][0] = 1; for(int j=0; j<n; ++j) dp[0][j] = 1;
五、综合案例分析
5.1 最大子数组和
问题描述:求整数数组中和最大的连续子数组
int maxSubArray(vector<int>& nums) {int currMax = nums[0], globalMax = nums[0];for(int i=1; i<nums.size(); ++i) {// 决策:继续扩展子数组 or 重新开始currMax = max(nums[i], currMax + nums[i]);// 更新全局最大值globalMax = max(globalMax, currMax);}return globalMax;
}
算法解析:
- 状态定义:currMax表示以当前元素结尾的最大子数组和
- 状态转移方程:
currMax = max(nums[i], currMax + nums[i]) - 空间优化:仅需维护两个变量
- 示例分析:
输入:[-2,1,-3,4,-1,2,1,-5,4]
输出:6(子数组[4,-1,2,1])
5.2 不同路径问题
问题描述:m x n网格从左上角到右下角的唯一路径数
int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 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];
}
算法解析:
- 状态定义:dp[i][j]表示到达(i,j)的路径数
- 状态转移方程:dp[i][j] = 上方路径数 + 左方路径数
- 初始化技巧:第一行和第一列都只有1种路径
- 空间优化:可用一维数组替代,dp[j] += dp[j-1]
六、动态规划调试技巧
6.1 DP表可视化
- 打印DP表中间状态
// 在LCS代码中插入调试输出 for(auto& row : dp) {for(int val : row) cout << val << " ";cout << endl; }
- 观察表数据是否符合预期
6.2 边界测试用例
- 空输入测试:空字符串、空数组等
- 极值测试:n=0, W=0等特殊情况
- 示例测试:使用题目给出的示例验证
6.3 常见错误排查
- 数组越界:检查索引是否正确(特别是从1开始的情况)
- 初始化错误:验证边界条件是否正确设置
- 循环顺序错误:检查是否按正确依赖顺序填充表格
- 状态转移方程错误:用简单用例手动验证
七、动态规划复杂度分析指南
7.1 时间复杂度计算
-
基本公式:状态数 × 每个状态的转移成本
- LCS问题:O(mn)状态 × O(1)转移 = O(mn)
- 背包问题:O(nW)状态 × O(1)转移 = O(nW)
-
多项式时间与伪多项式时间:
- 背包问题的O(nW)称为伪多项式时间
- 当W很大时(如指数级),算法效率会显著下降
7.2 空间复杂度优化
-
滚动数组技巧:
- 二维→一维:当当前行只依赖前一行时
- 示例:斐波那契数列、背包问题
-
状态压缩技巧:
- 使用位运算表示状态集合
- 常见于旅行商问题(TSP)等状压DP
八、动态规划进阶路线图
8.1 学习路径建议
-
基础阶段(1-2周):
- 斐波那契数列
- 爬楼梯问题
- 最大子数组和
-
提高阶段(2-4周):
- 背包问题系列
- 字符串编辑问题
- 矩阵路径问题
-
精通阶段(1-2月):
- 树形DP(二叉树最大路径和)
- 状态压缩DP(TSP问题)
- 区间DP(矩阵链乘法)
8.2 推荐练习题目
题目类型 | LeetCode题号 | 难度 |
---|---|---|
爬楼梯 | 70 | 简单 |
最长递增子序列 | 300 | 中等 |
零钱兑换 | 322 | 中等 |
正则表达式匹配 | 10 | 困难 |
买卖股票最佳时机 | 121/123 | 中等 |
九、动态规划代码模板库
9.1 一维DP模板
int dp[n];
dp[0] = initial_value;for(int i=1; i<n; ++i) {dp[i] = compute(dp[...]);
}return dp[n-1];
9.2 二维DP模板
vector<vector<int>> dp(m, vector<int>(n, 0));// 初始化边界
for(int i=0; i<m; ++i) dp[i][0] = ...;
for(int j=0; j<n; ++j) dp[0][j] = ...;// 填充表格
for(int i=1; i<m; ++i) {for(int j=1; j<n; ++j) {dp[i][j] = compute(dp[i-1][j], dp[i][j-1], ...);}
}
十、动态规划常见问题FAQ
Q:如何判断一个问题是否可以用DP解决?
A:检查问题是否具有:
- 最优子结构性质
- 重叠子问题性质
- 无后效性(当前决策不影响之前状态)
Q:DP和分治法的区别是什么?
A:分治法将问题分解为独立的子问题,而DP处理的是重叠的子问题
Q:如何处理环形结构问题?
A:常用技巧:
- 破环成链(复制数组)
- 分类讨论(考虑包含首元素和不包含的情况)
Q:如何选择记忆化递归还是迭代法?
A:
- 记忆化递归更直观,适合树形结构问题
- 迭代法效率更高,适合需要空间优化的情况
- 动态规划导图
相关文章:
【C++】动态规划从入门到精通
一、动态规划基础概念详解 什么是动态规划 动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题,并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题: 最优子结构&…...
【专栏预告】《VR 360°全景视频开发:从GoPro到Unity VR眼镜应用实战》
【专栏预告】每周天12:00更新,欢迎指导与交流。 专栏地址:《VR 360全景视频开发:从GoPro到Unity VR眼镜应用实战》 前言 随着VR技术的不断发展,360全景视频的需求也在逐年增长。尤其是在VR眼镜端,360全景视频带来了…...
【leetcode100】搜索插入位置
1、题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2…...
Java面试黄金宝典3
1. 什么是 NIO 原理 缓冲区(Buffer): 它是一个线性的、有限的基本数据元素序列,本质上是一块内存区域,被包装成了一个对象,以便于进行高效的数据读写操作。不同类型的基本数据都有对应的Buffer子类…...
vue3 报错 Could not find a declaration file for module ‘/App.vue‘
vue3 报错 Could not find a declaration file for module /App.vue.app.vue路径.js implicitly has an any type 问题描述原因分析:解决方案: 问题描述 Could not find a declaration file for module /App.vue.app.vue路径.js implicitly has an any …...
linux对串口设备文件进行重命名(删除、重建)
0.前言 最近在弄3562的自制板,有很多串口,然后发现设备文件名编号有些跳跃,不方便用户使用,因此,需要对这些设备文件进行重命名 1.查看设备号 我们需要知道目标设备文件的设备号,通过ls -l /dev/tty*查看…...
Linux内核传输层UDP源码分析
一、用户数据包协议(UDP) 1.UDP数据报头 UDP 提供面向消息的不可靠传输,但没有拥塞控制功能。很多协议都使用 UDP,如用于 IP 网络传输音频和视频的实时传输协议 (Real-time Transport Protocol,RTP),此类型…...
GitHub 超火的开源终端工具——Warp
Warp 作为近年来 GitHub 上备受瞩目的开源终端工具,以其智能化、高性能和协作能力重新定义了命令行操作体验。以下从多个维度深入解析其核心特性、技术架构、用户评价及生态影响力: 一、背景与核心团队 Warp 由前 GitHub CTO Jason Warner 和 Google 前…...
【Java基础巩固系列】异常
业务背景 业务开发中,总会遇到代码出现异常的情况,不合理的异常处理或不处理异常除了影响业务功能和中断业务功能外,还会增加排查问题的难度。所以我们要学会正确的使用异常处理。合理的异常处理能减少很多潜在的问题,是提高代码…...
sass介绍
1、Sass简介 Sass 是一种 CSS 的预编译语言。它提供了 变量(variables)、嵌套(nested rules)、 混合(mixins)、 函数(functions)等功能,并且完全兼容 CSS 语法。Sass 能…...
第1章:云原生时代:容器技术的发展历程与核心价值
第1章:云原生时代:容器技术的发展历程与核心价值 作者:DogDog_Shuai 阅读时间:约15分钟 难度:入门级 目录 1. 引言2. 容器技术的发展历程3. 容器技术的核心价值4. 云原生时代的机遇与挑战5. 总结1. 引言...
软考程序员考试知识点汇总
软考程序员考试(初级资格)主要考察计算机基础理论、编程能力及软件开发相关知识。以下是核心知识点总结及备考建议: 一、计算机基础 数制与编码 二进制、八进制、十进制、十六进制转换原码、反码、补码表示(整数与浮点数…...
JVM OOM问题如何排查和解决
在 Java 开发中,JVM OOM(OutOfMemoryError)问题通常是指程序运行时,JVM 无法为对象分配足够的内存空间,导致发生内存溢出的错误。这个问题往往和内存的配置、内存泄漏、或者资源过度使用等因素有关。 1. OOM 错误类型…...
折叠树报表
折叠树报表中包含了三种信息: 1.树组织信息-可展开、收拢 2.节点的统计信息(汇总求和) 3.每个节点对应的数据信息 一、准备数据 mysql8 数据库中存在两张表 org和store表。 org表和部分数据如下,其中orgname是组织的名称,codepath是完整的组织代码,seq是每个节点的顺序,可…...
python 数据可视化matplotib库安装与使用
要使用 matplotlib 库进行数据可视化,首先你需要确保已经安装了该库。如果你还没有安装,可以通过 Python 的包管理器 pip 来安装它。在你的命令行工具中运行以下命令来安装 matplotlib: pip install matplotlib安装完成后,你就可以…...
Springdoc配置参数详解
文章目录 **1. 基础配置****API 文档路径-springdoc.api-docs.path****Swagger UI 路径-springdoc.swagger-ui.path****是否启用 API 文档-springdoc.api-docs.enabled****是否启用 Swagger UI-springdoc.swagger-ui.enabled** **2. 全局元信息-info****应用标题-springdoc.inf…...
抖音视频数据获取实战:从API调用到热门内容挖掘
在短视频流量为王的时代,掌握抖音热门视频数据已成为内容运营、竞品分析及营销决策的关键。本文将手把手教你通过抖音开放平台API获取视频详情数据,并提供完整的代码实现及商业化应用思路。 一、抖音API权限申请与核心接口 抖音API需企业资质认证&…...
【数学建模】灰色关联分析模型详解与应用
灰色关联分析模型详解与应用 文章目录 灰色关联分析模型详解与应用引言灰色系统理论简介灰色关联分析基本原理灰色关联分析计算步骤1. 确定分析序列2. 数据无量纲化处理3. 计算关联系数4. 计算关联度 灰色关联分析应用实例实例:某企业生产效率影响因素分析 灰色关联…...
Spring Boot 与 Couchbase 整合教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 与 Couchbase 整合教程 环境要求 JDK 8Spring Boot 2.7.xCouchbase Server 7.xMaven/Gradle 步骤 1:创建Spring Boot项目 使用 st…...
Oracle ASM Failgroup故障组
Oracle ASM Failgroup故障组 1. 故障组的核心作用2. 故障组的配置规则3. 故障组的设计最佳实践4. 故障组的实际示例场景1:普通冗余(2个故障组)场景2:高冗余(3个故障组,跨数据中心) 关键注意事项…...
深度学习框架PyTorch——从入门到精通(2)张量
又名:张亮的一生~~ 张量(Tensors)初始化张量张量的属性张量上的操作与NumPy桥接 张量(Tensors) 张量是一种专门的数据结构,类似Python中的数组或者矩阵。在Torch中,我们使用张量来编码模型的输…...
pytorch小记(十三):pytorch中`nn.ModuleList` 详解
pytorch小记(十三):pytorch中nn.ModuleList 详解 PyTorch 中的 nn.ModuleList 详解1. 什么是 nn.ModuleList?2. 为什么不直接使用普通的 Python 列表?3. nn.ModuleList 的基本用法示例:构建一个包含两层全连…...
C语言-动态内存管理
1.为什么要有动态内存分配 我们现如今已经掌握的内存开辟方式有 int main() {int a 0;int arr[30] { 0 };return 0; } 这两种方式,但是这种开辟空间的方式有两个特点: 1.空间开辟大小是固定的 2.数组在申明的时候,必须指定数组的长度&…...
深入解析MySQL数据库分库分表技术
友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台gpt-4-turbo模型生成,仅供参考。 随着互联网应用的快速发展,单一数据库在面对大规模数据时可能会遇到性能瓶颈。因此,数据库分库分表作为一种…...
【Embedded World 2025:边缘 AI、存储革新与 1X nm 工艺重塑嵌入式未来】
Embedded World 2025于3月11-13日在德国纽伦堡举办,作为全球嵌入式系统领域顶级盛会,汇聚超千家展商与3万专业观众,聚焦嵌入式智能、安全管理及行业解决方案。展会呈现边缘AI、低功耗MCU、5G RedCap、新型存储及车规级技术等前沿方向…...
【人工智能基础2】机器学习、深度学习总结
文章目录 一、人工智能关键技术二、机器学习基础1. 监督、无监督、半监督学习2. 损失函数:四种损失函数3. 泛化与交叉验证4. 过拟合与欠拟合5. 正则化6. 支持向量机 三、深度学习基础:深度神经网络1、概念与原理2、多层神经网络训练方法 一、人工智能关键…...
MySQL如何存储表情符号?
存储表情符号 默认mysql的字符集是utf8,排序规则为 utf8_general_ci INSERT INTO department (name) VALUES (😄)在存储表情的时候会报 1366 - Incorrect string value: \xF0\x9F\x98\x84 for column name at row 1, Time: 0.007000s 这时需要修改字符…...
Unity Shader 学习16:全局光照 概念理解
- 全局光照 直接光 间接光,在没有开启GI的情况下是不计算间接光的(如果放了光照探针 倒是可以模拟间接光 <光照探针只影响动态物体>); - 处理对象:静态物体(static) 、 非静态(动态)物体; - 计算方…...
Jobby、Quarkus 和 Spring Boot对比
Jobby、Quarkus 和 Spring Boot 是三种不同的 Java 框架,各自有不同的设计目标和适用场景。以下是对它们的详细对比: 1. 设计目标 框架设计目标Jobby轻量级的任务调度框架,专注于任务调度和执行。Quarkus面向云原生和 Kubernetes 的 Java 框…...
Dubbo 服务发现
总览 学习 Dubbo 的服务发现机制,可以从以下几方面入手: 注册中心的配置服务的注册客户端拉取服务列表服务列表的本地缓存服务提供者列表变更的监听机制服务发现的接口设计 注册中心的配置 Dubbo 通过解析用户配置决定使用的注册中心。比如用户配置了…...
Pytorch使用手册—自定义 C++ 和 CUDA 运算符(专题五十一)
你将学到什么 如何将用 C++/CUDA 编写的自定义运算符与 PyTorch 集成如何使用 torch.library.opcheck 测试自定义运算符先决条件 1. PyTorch 2.4 或更高版本 2. 对 C++ 和 CUDA 编程有基本了解 注意 本教程也适用于 AMD ROCm,无需额外修改。 PyTorch 提供了一个庞大的运算符库…...
Linux 实时同步服务实现(Rsync 结合 Inotify)
文章目录 1. 实时同步服务介绍2. Inotify 机制介绍3. Inotify-toolRsync 实时同步实践3.1 确认远程数据传输服务部署完成3.2 检查Linux系统是否支持Inotify实时监控3.3 安装inotify-tools3.4 命令测试3.5 重要监控事件汇总3.6 使用步骤 4. Sersync 工具使用(重点&am…...
用Java写斗地主前期工作的一些小想法
目前我们并不是要实现一个游戏,而是要对斗地主游戏做准备,主要是做牌+洗牌+发牌+给发的牌进行排序。在这个过程中我希望通过集中方式来实现: 1. 使用集合+方法+字符串的运用完成以上功能 2. 使用面向对象思想,对1做改进,主要是对其排序的改进,从而理解面向对象的真正意…...
鸿蒙数据持久化之首选项
场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取…...
将bin文件烧录到STM32
将bin文件烧录到STM32 CoFlash下载生成hex文件hex2bin使用下载bin到单片机 CoFlash下载 选择需要安装的目录 在Config中可以选择目标芯片的类型 我演示的是 stm32f103c8t6 最小系统板 Adapter:烧录器类型 Max Clock:下载速度 Por:接口类型&am…...
AtCoder Beginner Contest 397(ABCDE)
目录 A - Thermometer 翻译: 思路: 实现: B - Ticket Gate Log 翻译: 思路: 实现: C - Variety Split Easy 翻译: 思路: 实现: D - Cubes 翻译:…...
jasypt-spring-boot-starter项目如何使用jasypt加密密码
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.iv.RandomIvGenerator; import org.jasypt.salt.RandomSaltGenerator;/*** 加密密码的工具** author xxx* since 2025-03-17*/ public class JasyptTest {public static void main(String[] a…...
[AI速读]混合语言IP集成:挑战与高效解决方案
在现代SoC(系统级芯片)设计中,IP(知识产权模块)复用是提升开发效率的关键。然而,当设计涉及多种硬件描述语言(如SystemVerilog、VHDL、SystemC)时,如何高效集成不同语言的IP模块成为一大难题。本文将从实际设计场景出发,探讨混合语言IP集成的核心挑战,并介绍一套方法…...
SpringSecurity——如何获取当前登录用户的信息
目录 1. 直接注入 Principal 2. 直接注入 Authentication 3. 注入 UsernamePasswordAuthenticationToken 4. 通过 SecurityContextHolder 获取 5. 使用自定义工具方法 总结 如何获取更多的用户信息 自定义用户实体类 如何忽略某些字段(不返回前端ÿ…...
ospf动态路由
一、为什么使用动态路由 OSPF(open shortest path first开放最短路径优先)是内部网关协议(IGP)的一种,基于链路状态算法(LS)。 OSPF企业级路由协议(RFC2328 OSPFv2),核心重点协议 OSPF共三个版本,OSPFV1主要是实验室…...
在react当中利用IntersectionObserve实现下拉加载数据
目录 一、传统的下拉加载方案 二、存在问题 1.性能较差 2.不够精确 三、IntersectionObserve版本下拉加载 1、callback 2、options 四、IntersectionObserver实例 1、Intersection的优势 2、实现思路 3、代码实现 在进行前端开发的过程中,常常会碰到下拉…...
SpringBoot之如何集成SpringDoc最详细文档
文章目录 一、概念解释1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 关系与区别 二、SpringDoc基本使用1、导包2、正常编写代码,不需要任何注解3、运行后访问下面的链接即可 三、SpringDoc进阶使用1、配置文档信息2、配置文档分组3、springdoc的配置参数**1. 基…...
Transaction rolled back because it has been marked as rollback-only问题解决
transaction rolled back because it has been marked as rollback-only 简略总结> 发生场景:try-catch多业务场景 发生原因:业务嵌套,事务管理混乱,外层业务与内层业务抛出异常节点与回滚节点不一致。 解决方式:修…...
单片机写的小液晶屏驱动+汉字滚屏
单片机写的小液晶屏驱动汉字滚屏 stm32f401freertos内置HZK16 单片机汉字滚屏...
SpringBoot整合LangChain4j操作AI大模型实战详解
一、引言 在当今这个人工智能飞速发展的时代,AI大模型已经逐渐渗透到我们生活的方方面面,为企业和开发者带来了前所未有的机遇。然而,如何高效地接入并利用这些AI大模型,成为了摆在许多开发者面前的一道难题。SpringBoot作为一款…...
深度解析 | Android 13 Launcher3分页指示器改造:横线变圆点实战指南
一、需求背景与技术挑战 在Android 13系统定制开发中,我们面临将Launcher3桌面从传统双层架构优化为现代单层布局的挑战。原生系统采用的分页横线指示器在视觉呈现上存在两点不足: 风格陈旧不符合Material You设计规范 空间占用较大影响屏幕利用率 通…...
【Qt】private槽函数可以被其他类中的信号连接
private槽函数可以被其他类中的信号连接。 即使 B 类的槽函数是 private 的,A 类通过信号连接 B 类的槽函数也没有问题。这是因为 Qt 的信号和槽机制是通过元对象系统(Meta-Object System)实现的,而不是直接调用函数。只要信号和…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
Python --**kwargs
在 Python 中,**kwargs 是一个特殊语法,用于在函数定义中接收任意数量的关键字参数(即键值对参数),并将这些参数以字典形式存储。它是 Python 中处理动态参数的强大工具,适用于需要灵活传递参数的场景。 1.…...
网络编程之客户端通过服务器与另外一个客户端交流
服务器使用select模型搭建,客户端1使用线程搭建,客户端2使用poll模型搭建, 使用时需要先运行服务器,具体编译可看我最后的图片 head.h头文件 #ifndef __HEAD_H_ #define __HEAD_H_ #include <stdio.h> #include <string…...