动态规划-第2篇
前言:在上一篇文章中,我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解,动态规划为我们提供了高效的解决方案。然而,动态规划并不是一成不变的,它有很多不同的技巧和变种,能够应对各类复杂问题。
在本篇文章中,我们将深入探讨一些常见的动态规划问题及其解法,学习如何巧妙地设计状态转移方程,优化空间复杂度,并进一步掌握动态规划的核心思想。通过具体实例,你将能够更好地理解如何在实际开发中运用动态规划来解决复杂问题。🌼🌼
7. 礼物的最⼤价值(medium)
1. 题⽬链接:LCR 166. 珠宝的最高价值
2.解法(动态规划):
算法思路:
1. 状态表⽰:
对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式:
dp[i][j] 表⽰:⾛到 [i, j] 位置处,此时的最⼤价值。
2. 状态转移⽅程:
对于 dp[i][j] ,我们发现想要到达 [i, j] 位置,有两种⽅式:
i. 从 [i, j] 位置的上⽅ [i - 1, j] 位置,向下⾛⼀步,此时到达 [i, j] 位置能
拿到的礼物价值为 dp[i - 1][j] + grid[i][j] ;
ii. 从 [i, j] 位置的左边 [i, j - 1] 位置,向右⾛⼀步,此时到达 [i, j] 位置能拿到的礼物价值为 dp[i][j -1] + grid[i][j]
我们要的是最⼤值,因此状态转移⽅程为:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] 。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,「添加⼀⾏」,并且「添加⼀列」后,所有的值都为 0 即可。
4. 填表顺序:
根据「状态转移⽅程」,填表的顺序是「从上往下填写每⼀⾏」,「每⼀⾏从左往右」。
5. 返回值:
根据「状态表⽰」,我们应该返回 dp[m][n] 的值。
3.C++ 算法代码:
class Solution {
public:int jewelleryValue(vector<vector<int>>& vv) {int m=vv.size();int n=vv[0].size();vector<vector<int>>dp(m+1,vector<int>(n+1));dp[0][0]=0;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1])+vv[i-1][j-1];}}return dp[m][n];}
};
8.下降路径最⼩和(medium)
1. 题⽬链接:931. 下降路径最小和 - 力扣(LeetCode)
2. 解法(动态规划):
算法思路:
关于这⼀类题,由于我们做过类似的,因此「状态表⽰」以及「状态转移」是⽐较容易分析出来的。
⽐较难的地⽅可能就是对于「边界条件」的处理。
1. 状态表⽰:
对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,到达⽬标位置有多少种⽅式;
ii. 从起始位置出发,到达 [i, j] 位置,⼀共有多少种⽅式
这⾥选择第⼆种定义状态表⽰的⽅式:
dp[i][j] 表⽰:到达 [i, j] 位置时,所有下降路径中的最⼩和。
2. 状态转移⽅程:
对于普遍位置 [i, j] ,根据题意得,到达 [i, j] 位置可能有三种情况: i. 从正上⽅ [i - 1, j] 位置转移到 [i, j] 位置;
ii. 从左上⽅ [i - 1, j - 1] 位置转移到 [i, j] 位置;
iii. 从右上⽅ [i - 1, j + 1] 位置转移到 [i, j] 位置;
我们要的是三种情况下的「最⼩值」,然后再加上矩阵在 [i, j] 位置的值。
于是 dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j + 1])) + matrix[i][j] 。
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,需要「加上⼀⾏」,并且「加上两列」。所有的位置都初始化为⽆穷⼤,然后将第⼀⾏
初始化为 0 即可。
4. 填表顺序:
根据「状态表⽰」,填表的顺序是「从上往下」。
5. 返回值:
注意这⾥不是返回 dp[m][n] 的值!
题⽬要求「只要到达最后⼀⾏」就⾏了,因此这⾥应该返回「 dp 表中最后⼀⾏的最⼩值」。
3.C++ 算法代码
class Solution
{
public:
int minFallingPathSum(vector<vector<int>>& matrix)
{
// 1. 创建 dp 表
// 2. 初始化
// 3. 填表
// 4. 返回结果
int n = matrix.size();
vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));
// 初始化第⼀⾏
for(int j = 0; j < n + 2; j++) dp[0][j] = 0;for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j
+ 1])) + matrix[i - 1][j - 1];
int ret = INT_MAX;
for(int j = 1; j <= n; j++)
ret = min(ret, dp[n][j]);
return ret;
}
}
9. 最⼩路径和(medium)
1.题目链接:64. 最小路径和 - 力扣(LeetCode)
2. 解法(动态规划):
算法思路:
像这种表格形式的动态规划,是⾮常容易得到「状态表⽰」以及「状态转移⽅程」的,可以归结到
「不同路径」⼀类的题⾥⾯。
1. 状态表⽰:
对于这种路径类的问题,我们的状态表⽰⼀般有两种形式:
i. 从 [i, j] 位置出发,巴拉巴拉;
ii. 从起始位置出发,到达 [i, j] 位置,巴拉巴拉。
这⾥选择第⼆种定义状态表⽰的⽅式:
dp[i][j] 表⽰:到达 [i, j] 位置处,最⼩路径和是多少。
2. 状态转移:
简单分析⼀下。如果 dp[i][j] 表⽰到达 到达 [i, j] 位置处的最⼩路径和,那么到达 [i, j] 位置之前的⼀⼩步,有两种情况:
i. 从 [i - 1, j] 向下⾛⼀步,转移到 [i, j] 位置;
ii. 从 [i, j - 1] 向右⾛⼀步,转移到 [i, j] 位置。
由于到 [i, j] 位置两种情况,并且我们要找的是最⼩路径,因此只需要这两种情况下的最⼩值,再加上 [i, j] 位置上本⾝的值即可。
也就是: dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,「添加⼀⾏」,并且「添加⼀列」后,所有位置的值可以初始化为⽆穷⼤,然后让 dp[0][1] = dp[1][0] = 1 即可。
4. 填表顺序:
根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,每⼀⾏「从左往
后」。
5. 返回值:
根据「状态表⽰」,我们要返回的结果是 dp[m][n] 。
3.C++ 算法代码:
class Solution
{
public:
int minPathSum(vector<vector<int>>& grid)
{
// 1. 创建 dp 表
// 2. 初始化
// 3. 填表
// 4. 返回结果
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
dp[0][1] = dp[1][0] = 0;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j -
1];
return dp[m][n];
}
}
10. 地下城游戏(hard)
1. 题⽬链接:174. 地下城游戏 - 力扣(LeetCode)
2. 解法(动态规划):
算法思路:
1. 状态表⽰:
这道题如果我们定义成:从起点开始,到达 [i, j] 位置的时候,所需的最低初始健康点数。那么我们分析状态转移的时候会有⼀个问题:那就是我们当前的健康点数还会受到后⾯的路径的影响。也就是从上往下的状态转移不能很好地解决问题。
这个时候我们要换⼀种状态表⽰:从 [i, j] 位置出发,到达终点时所需要的最低初始健康点
数。这样我们在分析状态转移的时候,后续的最佳状态就已经知晓。
综上所述,定义状态表⽰为:
dp[i][j] 表⽰:从 [i, j] 位置出发,到达终点时所需的最低初始健康点数。
2. 状态转移⽅程:
对于 dp[i][j] ,从 [i, j] 位置出发,下⼀步会有两种选择(为了⽅便理解,设 dp[i] [j] 的最终答案是 x):
i. ⾛到右边,然后⾛向终点
那么我们在 [i, j] 位置的最低健康点数加上这⼀个位置的消耗,应该要⼤于等于右边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i][j + 1] 。
通过移项可得: x >= dp[i][j + 1] - dungeon[i][j] 。因为我们要的是最⼩值,因此这种情况下的 x = dp[i][j + 1] - dungeon[i][j] ;
ii. ⾛到下边,然后⾛向终点
那么我们在 [i, j] 位置的最低健康点数加上这⼀个位置的消耗,应该要⼤于等于下边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i + 1][j] 。
通过移项可得: x >= dp[i + 1][j] - dungeon[i][j] 。因为我们要的是最⼩值,因此这种情况下的 x = dp[i + 1][j] - dungeon[i][j] ;
综上所述,我们需要的是两种情况下的最⼩值,因此可得状态转移⽅程为:
dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]
但是,如果当前位置的 dungeon[i][j] 是⼀个⽐较⼤的正数的话, dp[i][j] 的值可能变
成 0 或者负数。也就是最低点数会⼩于 1 ,那么骑⼠就会死亡。因此我们求出来的
如果⼩于等于 0 的话,说明此时的最低初始值应该为 1 。处理这种情况仅需让 dp[i] [j] 与 1 取⼀个最⼤值即可:
dp[i][j] = max(1, dp[i][j])
3. 初始化:
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
ii. 「下标的映射关系」。
在本题中,在 dp 表最后⾯添加⼀⾏,并且添加⼀列后,所有的值都先初始化为⽆穷⼤,然后让 dp[m][n - 1] = dp[m - 1][n] = 1 即可。
4. 填表顺序:
根据「状态转移⽅程」,我们需要「从下往上填每⼀⾏」,「每⼀⾏从右往左」。
5. 返回值:
根据「状态表⽰」,我们需要返回 dp[0][0] 的值。
3.C++ 算法代码:
class Solution
{
public:
int calculateMinimumHP(vector<vector<int>>& dungeon)
{
int m = dungeon.size(), n = dungeon[0].size();
// 建表 + 初始化
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
dp[m][n - 1] = dp[m - 1][n] = 1;
// 填表
for(int i = m - 1; i >= 0; i--)
for(int j = n - 1; j >= 0; j--)
{
dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];
dp[i][j] = max(1, dp[i][j]);
}
// 返回结果
return dp[0][0];
}
}
简单多状态 dp 问题
11. 按摩师(easy)
打家劫舍问题的变形~ ⼩偷变成了按摩师
1. 题⽬链接:面试题 17.16. 按摩师
2. 解法(动态规划):
算法思路:
1. 状态表⽰:
对于简单的线性 dp ,我们可以⽤「经验 + 题⽬要求」来定义状态表⽰:
i. 以某个位置为结尾,巴拉巴拉;
ii. 以某个位置为起点,巴拉巴拉。
这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:
dp[i] 表⽰:选择到 i 位置时,此时的最⻓预约时⻓。
但是我们这个题在 i 位置的时候,会⾯临「选择」或者「不选择」两种抉择,所依赖的状态需要
细分:
▪ f[i] 表⽰:选择到 i 位置时, nums[i] 必选,此时的最⻓预约时⻓;
▪ g[i] 表⽰:选择到 i 位置时, nums[i] 不选,此时的最⻓预约时⻓。
2. 状态转移⽅程:
因为状态表⽰定义了两个,因此我们的状态转移⽅程也要分析两个:
对于 f[i] :
▪ 如果 nums[i] 必选,那么我们仅需知道 i - 1 位置在不选的情况下的最⻓预约时⻓,
然后加上 nums[i] 即可,因此 f[i] = g[i - 1] + nums[i] 。
对于 g[i] :
▪ 如果 nums[i] 不选,那么 i - 1 位置上选或者不选都可以。因此,我们需要知道 i置上选或者不选两种情况下的最⻓时⻓,因此 g[i] = max(f[i - 1], g[i])
3. 初始化:
这道题的初始化⽐较简单,因此⽆需加辅助节点,仅需初始化 f[0] = nums[0], g[0] = 0即可。
4. 填表顺序
根据「状态转移⽅程」得「从左往右,两个表⼀起填」。
5. 返回值
根据「状态表⽰」,应该返回 max(f[n - 1], g[n - 1]) 。
3.C++ 算法代码:
class Solution {
public:
int massage(vector<int>& nums) {
// 1. 创建⼀个 dp 表
// 2. 初始化
// 3. 填表
// 4. 返回值
int n = nums.size();
if(n == 0) return 0; // 处理边界条件
vector<int> f(n);
auto g = f;
f[0] = nums[0];
for(int i = 1; i < n; i++)
{
f[i] = g[i - 1] + nums[i];
g[i] = max(f[i - 1], g[i - 1]);
}
return max(f[n - 1], g[n - 1]);
}
};
12. 打家劫舍II (medium)
1.题目链接: 213. 打家劫舍 II - 力扣(LeetCode)
2. 解法(动态规划)
算法思路:
这⼀个问题是「打家劫舍I」问题的变形。
上⼀个问题是⼀个「单排」的模式,这⼀个问题是⼀个「环形」的模式,也就是⾸尾是相连的。但
是我们可以将「环形」问题转化为「两个单排」问题:
a. 偷第⼀个房屋时的最⼤⾦额 x ,此时不能偷最后⼀个房⼦,因此就是偷 [0, n - 2] 区间的房⼦;
b. 不偷第⼀个房屋时的最⼤⾦额 y ,此时可以偷最后⼀个房⼦,因此就是偷 [1, n - 1] 区间的房⼦;
两种情况下的「最⼤值」,就是最终的结果。
因此,问题就转化成求「两次单排结果的最⼤值」
3. C++算法代码:
class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();int f1=test(nums,2,n-2)+nums[0];//第一个偷的话int g1=test(nums,1,n-1);//第一个不偷的话return max(f1,g1);}int test(vector<int>& nums,int left,int right)//与按摩问题一样{if(left>right)return 0;int n=nums.size();vector<int> f(n);f[left]=nums[left];auto g=f;g[left]=0;for(int i=left+1;i<=right;i++){f[i]=g[i-1]+nums[i];g[i]=max(f[i-1],g[i-1]);}return max(f[right],g[right]);}
};
相关文章:
动态规划-第2篇
前言:在上一篇文章中,我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解,动态规划为我们提供了高效的解决方案。然而,动态规划并不是一成不变的,它有很多不同的技巧和变种,…...
数据库查问题常用OS命令汇总
1、内存使用情况查看 top //查看活跃进程占用情况 free -mh //查看操作系统当前可用内存 2、cpu使用情况 lscpu //查看os cpu情况 sar -u -f sar文件名 -s hh:mm:ss -e hh:mm:ss //查看对应日期的历史cpu情况 top //查看当前活跃进程使用cpu情况 3、io情况 iostat …...
基于springboot住院管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展,推动了很多行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、畅通、高效的线上管理系统。当前的住院管理存在管理效率低下&…...
《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》
导语 "你是否想过用Python开发一款可玩性高的双人合作游戏?本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏!包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点,文末提供完整代码包下载!" 哈…...
【ES6】在ES6中自定义数组
在ES6中是允许自定义类扩展基础类型的,因为这些基础类型是有构造函数的,在JS中类就是函数。 // 自定义数组 class myArray extends Array {constructor() {super();} }let arr new myArray();arr.push(1);console.log(arr);重写Array的原生方法 ES6的…...
软件开发项目有哪些风险
软件开发项目风险主要包括 需求不明确、技术实现难度大、进度延误、成本超支、质量问题。其中,需求不明确可能导致功能设计反复修改;技术实现难度大会使开发过程中不断遇到未知挑战;进度延误常常因资源配置不足或变更频繁而发生;成…...
47.HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现 文章目录 HarmonyOS NEXT 登录模块开发教程࿰…...
RAGFlow版本升级-Win10系统Docker
下载源码压缩包 https://github.com/infiniflow/ragflow.git 删除旧版本代码文件夹,把下载的代码解压到原先目录 更新一下env文件:ragflow/docker/.env 把值改为最新版本即可 RAGFLOW_IMAGEinfiniflow/ragflow:v0.17.1 更新一下docker docker compose -…...
dns劫持是什么?常见的劫持类型有哪些?如何预防?
DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面࿰…...
Python精进系列: isinstance 函数
Python isinstance函数:类型检查的得力助手 目录 Python isinstance函数:类型检查的得力助手引言一、isinstance函数基础语法结构简单示例 二、isinstance函数的应用场景函数参数类型检查数据处理与类型转换面向对象编程中的类型判断 三、isinstance函数…...
【基础知识】回头看Maven基础
版本日期修订人描述V1.02025/3/7nick huang创建文档 背景 项目过程中,对于Maven的pom.xml文件,很多时候,我通过各种参考、仿写,最终做出想要的效果。 但实际心里有些迷糊,不清楚具体哪个基础的配置所实现的效果。 今…...
练习题:81
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 运行思路 结束语 Python题目 题目 使用字典推导式创建一个字典,键为 1 到 10 的整数,值为键的平方。 题目分析 需求理解 本题要求使用 Python 的字典…...
三角函数:从宇宙法则到AI革命的数学密钥
——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos θ ℜ ( e i θ ) y sin θ ℑ ( e i θ ) \begin…...
【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models
论文信息 论文标题:Best Practices and Lessons Learned on Synthetic Data for Language Models 作者信息: Ruibo Liu, Jerry Wei, Fangyu Liu, Chenglei Si, Yanzhe Zhang, Jinmeng Rao, Steven Zheng, Daiyi Peng, Diyi Yang, Denny Zhou1 and Andre…...
Java高频面试之集合-10
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详解红黑树?HashMap为什么不用二叉树/平衡树呢? 一、红黑树(Red-Black Treeÿ…...
Keil 5 环境下STM32F4 HAL库版本MDK工程创建详细步骤(适合小白,附工程源码)
一、前期准备 1.安装好keil Keil(MDK) 5 软件安装教程-CSDN博客https://blog.csdn.net/qq_42748213/article/details/90485750 2.安装好STM32F4的芯片包 Keil5中STM32F4xx芯片包下载安装_stm32f4芯片包-CSDN博客https://blog.csdn.net/weixin_45783141/article/details/131…...
【微服务】Nacos 配置动态刷新(简易版)(附配置)
文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境:Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明:官方版本说明 <!--读取boo…...
LabVIEW cRIO中CSV文件的读取
在LabVIEW cRIO中读取CSV文件,需通过文件传输、路径配置、数据解析等步骤实现。本文详细说明如何通过代码读取本地存储的CSV文件,并探讨直接通过对话框选择文件的可行性及替代方案。 一、CSV文件传输至cRIO本地存储 1. 使用NI MAX文件管理 步骤…...
双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!
2025-03-10 语言更新 模式匹配支持守卫(Pattern Guard) 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式,并且模式守卫为真的情况下才会执行。如果模式守卫为假,则会…...
从青铜到王者:六大排序算法实战解析
前言 在编程的世界里,排序算法如同一颗璀璨的明珠,闪耀着智慧的光芒。它不仅是计算机科学的基础知识点,更是每一位程序员必备的技能。今天,就让我们一同走进排序算法的世界,深入探究冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序这六大经典算法的精髓所在,…...
011-base64
base64 编码 以下是C实现的Base64字符串加密算法及其原理说明,综合了多个技术文档的核心要点: 一、Base64编码原理 Base64是一种将二进制数据转换为ASCII字符的编码方式,核心原理基于 3字节转4字符 的转换规则: 分组规则&…...
汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响
引言 失去发动机的掩蔽效应后,新能源电车的NVH问题,成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别,根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源?今天分享的这个案例,内…...
springcloud gateway通过数据库获取路由信息
在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置,可以实现灵活的路由管理。以下是详细实现步骤: 1. 数据库表设计 创建路由配置表 gateway_route: CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…...
QtDataVisualization使用
Qt Data Visualization 是一个开源的第三方库,它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表,包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块,因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。…...
【Go每日一练】实现简单的控制台计算器
👻创作者:丶重明 👻创作时间:2025年3月7日 👻擅长领域:运维 目录 1.😶🌫️题目:简单的控制台计算器2.😶🌫️代码输出3.😶&#…...
TDengine 数据对接 EXCEL
简介 通过配置使用 ODBC 连接器,Excel 可以快速访问 TDengine 的数据。用户可以将标签数据、原始时序数据或按时间聚合后的时序数据从 TDengine 导入到 Excel,用以制作报表整个过程不需要任何代码编写过程。 前置条件 准备以下环境: TDen…...
1.8 双指针专题:四数之和
1.题目链接 18. 四数之和 - 力扣(LeetCode)18. 四数之和 - 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元…...
基于用户标签和协同过滤混合算法的商城推荐系统设计与实现
一、研究背景 随着电子商务的快速发展,用户面对海量商品时往往面临“信息过载”问题。传统的推荐算法(如协同过滤)在用户行为数据稀疏或新用户场景下存在冷启动、推荐多样性不足等缺陷。 现状与挑战: 协同过滤:依赖用…...
软件版本号设计
软件版本号的设计是软件开发中的重要环节,它不仅帮助开发团队管理代码,还能让用户清楚地了解软件的更新状态。以下是常见的版本号设计方法和最佳实践,供你参考: 1. 常见的版本号设计规范 语义化版本控制(Semantic Ver…...
ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展
今天向大家介绍的这篇文章题目为:“Protein−Peptide Docking with ESMFold Language Model”,近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略,评估其在预测蛋白质-肽相互作用方面的性能&a…...
【项目】负载均衡式在线OJ
负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...
Android启动速度优化
Android启动速度优化 一、应用启动基础知识 1.1 启动类型 Android应用的启动类型主要分为三种: 冷启动(Cold Start):应用进程不存在,系统需要创建新的进程,加载并启动应用。这是最耗时的启动方式。 温启动(Warm Start):应用进程存在,但Activity可能被销毁,需要重新创…...
python爬虫碰到IP被封的情况,如何解决?
在数据抓取和爬虫开发的实践中,Python作为一种功能强大且易于上手的编程语言,被广泛应用于网络数据的采集。然而,随着网络环境的日益复杂,爬虫活动也面临着越来越多的挑战,其中IP被封便是常见且棘手的问题。IP被封不仅…...
Web网页制作(静态网页):千年之恋
一、是用的PyCharm来写的代码 二、代码中所用到的知识点(无 js) 这段HTML代码展示了一个简单的注册页面,包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面,包含了常见的HTML元素和表单控件。通过CSS样…...
mac安装mysql之后报错zsh: command not found: mysql !
在Mac上安装MySQL后,如果终端中找不到mysql命令,通常是 因为MySQL的命令行工具(如mysql客户端)没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...
Spring Boot 启动失败:Failed to start bean ‘documentationPluginsBootstrapper’ 解决方案
文章目录 1. 问题描述 🎯2. 可能原因分析 🔍原因 1:SpringFox 版本与 Spring Boot 版本不兼容 ❌✅ 解决方案:添加兼容性配置(首选!!!!) 原因 2:S…...
Python Cookbook-3.16 查看汇率
任务 想周期性地(用 crontab 或者 Windows计划任务来运行某 Python 脚本)从 Web 获取数据,监视某两种货币之间的兑换比例,并在两者之间的汇率达到某个值时发送提醒邮件。 解决方案 这个任务和一系列的从 Web 获取数据的监控任务很类似,它们…...
Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策
一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些,DeepSeek是知识型大脑,Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力,例如撰写论文、润…...
Redis存数据就像存钱:RDB定期存款 vs AOF实时记账
Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...
【从零开始学习计算机科学】编译原理(一)编译过程概述
【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...
第十八:go 并发 goroutine
channel 可以让多个goroutine 之间实现通信 Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量…...
基于QGIS的二次开发(四):矢量编辑与属性表操作
一、实验目的 本次实验续接上一次的实验内容,旨在通过设计与开发地理信息系统的过程,加深学生对地理信息系统的理解,并掌握相关的设计与开发技能,包括熟悉地理信息系统的设计与开发流程,加强对 MVC 软件设计模式的理解…...
AI日报 - 2025年3月13日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Reka开源21B参数推理模型Flash 3,推出企业智能平台Nexus 🔬 模型采用RLOO方法结合模型与规则基础奖励,实现高效推理 ▎💼 商业动向 | Waymo在…...
lua C语言api学习1 编译第一个程序
本文开始进行lua C语言api的学习 1 简介 lua语言与C语言使用还是很紧密,以前我只是学习lua语言比较多,C语言api部分了解比较少,最近在学习tcc编译器的使用进一步学习一下lua C语言api的使用。 2 配置编译环境 首先需配置好tcc编译器环境[参考],再配置好lua源码路径[参考],新…...
【物联网-WIFI】
物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-...
在MATLAB中实现PID控制仿真
在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例: 方法1:使用MATLAB脚本编程(基于控制系统工具箱) 步骤1:定义被控对象的数学模型 假设被控对象是…...
C#实现本地Deepseek模型及其他模型的对话v1.4
前言 系 统:Window11 开发工具:Visual Studio 2022 相关技术:C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModelÿ…...
用sphinx-doc整理文档#2
上一篇博客:用sphinx-doc整理文档 回头看,上一篇博客已经是18年的事情了。最近我又开始维护起18年的项目了。最近策划同事提了一些需求。我又改进了一波,所以有本文。 sphinx支持导出pdf sphinx本身是支持导出pdf的,命令如下&am…...
DBeaver部分操作指南(数据库连接,构造ERD图,格式化SQL)
详细步骤指导如何使用DBeaver来连接到数据库: 步骤 1: 下载并安装 DBeaver 如果还没有安装DBeaver,请访问DBeaver官网下载适合操作系统的版本,并按照指示完成安装。 步骤 2: 启动 DBeaver 安装完成后,启动DBeaver应用程序。 …...
十种处理权重矩阵的方法及数学公式
1. 权重归一化(Weight Normalization) 目的:通过分离权重向量的范数和方向来加速训练。公式:对于权重向量 w \mathbf{w} w,归一化后的权重 w ′ \mathbf{w} w′ 为: w ′ w ∥ w ∥ \mathbf{w} \frac{…...