从搜索丝滑过渡到动态规划的学习指南
搜索&动态规划
- 前言
- 砝码称重
- 满分代码及思路
- solution 1(动态规划)
- solution 2(BFS)
- 跳跃
- 满分代码及思路
- solution 1(动态规划)
- solution 2 (BFS)
- 积木画
- 满分代码及思路
- 动态规划思路讲解
- solution
前言
本文主要是通过一些竞赛真题 通过搜索和动态规划这两个角度 对比地去思考和解决这类令人头大的问题
我真的总感觉 并且这种感觉真的是越来越强烈 搜索我们总是正方向的去搜下一个满足需求的位置
而动态规划 我们总是去看 当前位置或者状态 能通过什么方式来走到 (状态转移) 而且往往需要取最优 这是一个逆向的过程 而且往往逆向是比较难的 所以我一开始连解析都看不懂 但是你一旦理解了这个思考方式 就会轻松很多很多
砝码称重
题目链接
满分代码及思路
solution 1(动态规划)
#include <bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1e5+10;
//1首先明确状态和选择
//这题中状态就是重量和可用的砝码 选择就是放还是不放
//2.明确dp数组的定义
//dp[i][j]的定义就是对于前i个砝码是否能凑出来j的重量
//dp[3][2]=1 那意味着 对于前3个砝码能凑出2
//3.根据选择 写出状态转移方程
//放
//dp[i][j]=dp[i-1][j-wt[i]](因为是天平所以也有可能是加上当前重量)
//根据定义来理解就是 对于前i-1个砝码能凑出j-w[i]的重量 那么对于前i个砝码必定能凑出j的重量
//不放
//dp[i][j]=dp[i][j-1];
bool dp[N][M];
int n,m;
int wt[N];
int cnt=0;
int dynamic()
{for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j]+dp[i-1][abs(j-wt[i])]+dp[i-1][j+wt[i]];//分别对应不放 放左边 放右边}}for(int i=1;i<=m;i++)//枚举所有重量{if(dp[n][i])//如果对于前n个砝码能凑出来i的重量 {cnt++;}}return cnt;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>wt[i];m+=wt[i];//}memset(dp,0,sizeof(dp));dp[0][0]=1;//basecase 对于前0个砝码能凑出0的重量int res=dynamic();cout<<res<<endl;return 0;
}
solution 2(BFS)
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
queue<int> q;
const int N = 1e5+10;
bool sign[N];
int n,key;
int main()
{cin>>n;q.push(0);int ans = 0;for(int i=0; i<n; i++){cin>>key;queue<int> q2;while(!q.empty())//以q队列来加入,因为对每个key都进行q.front()+key和//abs(q.front()-key)进行筛选,所以不用管左边和右边是否有重复的砝码{if(!sign[q.front()+key])//这种情况相当于砝码全部放到右边{q2.push(q.front()+key);//如q2的队列sign[q.front()+key] = true;}if(!sign[abs(q.front()-key)])//左边和右边都放砝码{q2.push(abs(q.front()-key));sign[abs(q.front()-key)] = true;}q2.push(q.front());//把q.front()入到q2的队列,以便保存数据q.pop();//q出队}q = q2;//将q2赋值给q,保存数据}while(!q.empty()){if(q.front()>0) ans++;//因为q第一个入队的是0,但0又不算,所以把0排除在外q.pop();}cout<<ans;return 0;
}
跳跃
满分代码及思路
solution 1(动态规划)
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int n,m;
int dp[N+1][N+1];
int val[N][N];
int dx[9]={-1,-2,-3,0,0,0,-1,-1,-2};
int dy[9]={0,0,0,-1,-2,-3,-1,-2,-1};
//其实我最开始想使用bfs来写 感觉比较容易想到 因为这题数据范围不算大而且只有一个测试点
//**********************************************************
//1 首先这题中的状态和选择是什么?
//状态就是 权值以及位置 选择就是走的方向//2 我们怎样定义DP数组?
//可以定义为 从(1,1)走到第(i,j)时的最大权值 //3 最后 我们怎么样根据选择写出状态转移方程
//我们无非就是九种选择对应九种方向 我们只需要把每种选择取最优就好
//所以总的来说 我们只需要不断计算 当下一个位置的权值会使选择之前的权值变大的时候 再更新dp数组就好
//即 dp[i][j]=dp[i+dx[k]][j+dy[k]]+val[i][j];int dynamic()
{//根据basecase以及返回值确定遍历的顺序for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<9;k++){if(i+dx[k]>=1 && j+dy[k]>=1)//边界检查一下{if(dp[i][j]<dp[i+dx[k]][j+dy[k]]+val[i][j]){dp[i][j]=dp[i+dx[k]][j+dy[k]]+val[i][j];}}}}}return dp[n][m];
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>val[i][j];}}memset(dp,0,sizeof(dp));//basecasedp[1][1]=val[1][1];int res=dynamic();cout<<res<<endl;return 0;
}
solution 2 (BFS)
#include <stdio.h>
#include <stdlib.h>int a[100][100]; //数据数组
int state[100][100] = { 0 }; //表示每一个坐标是否走过
int m, n; //方格图大小
int newsum; //每走一步刷新权重
int max = 0; //记录每次走到终点时权重最大值
int next[10][2] = { /* A */{0,1},{0,2},{0,3},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2},{3,0} }; // 每次只能走3格距离,在网格中排列如上,A为每一步起始点void dfs(int x, int y) {int x1, y1; // 每走一步新的坐标if (x == m - 1 && y == n - 1) { //由于不断往下搜索,将超出边界的移动都舍弃了,最终一定会到达mn终点,记录下此时的权重max = max > newsum ? max : newsum;return; //仅仅为一条路,回到上一步,走没走过的路}for (int k = 0; k <= 9; k++) { //循环遍历当前坐标下下一次运动的新坐标x1 = x + next[k][0];y1 = y + next[k][1];if (x1 >= m || y1 >= n) continue; //超出边界,舍弃if (state[x1][y1] == 0) { //未超边界且没有经过该点,从该点出发,走过该点state[x1][y1] = 1; newsum = newsum + a[x1][y1]; dfs(x1, y1); // 则该点继续往下搜索state[x1][y1] = 0; newsum -= a[x1][y1]; // 回到没走过这个点的状态,更新state以及newsum}}return;
}int main()
{scanf("%d %d", &m, &n);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++)scanf("%d", &a[i][j]);}newsum += a[0][0];max = newsum;state[0][0] = 1; //数据初始化,相当于将小蓝放在(0,0)位置dfs(0, 0); printf("%d", max);return 0;
}
积木画
满分代码及思路
动态规划思路讲解
好 首先我们需要分成三步
- 1.在这题中 回答我什么是状态 什么是选择
- 回顾之前我写的文章 状态是不是就是会改变的量 选择是不是影响状态改变的量
- 但是我们好像直接地认为 状态就是剩余的格子 选择就是选择哪种积木来摆 这是不太妥当的 因为 这样我试了一下不仅我们自己都不知道这个dp数组的含义是什么 更不要说写状态转移方程了
- 所以我们需要在考虑一下 怎样是合适的
我们可以这样想,一个积木放上去后,可能会出现三种情况:第一行比第二行多出一个积木;两行积木数相等;第二行比第一行多出一个积木。
这时候有同学可能会问:为什么最多就多出一个积木呢?
因为最后的答案一定是两行积木数相等,如果两行差的多了,就不能用 L 型积木填补。只用 I 型积木填补的话,只能横着填补,我们完全可以在之前相差不超过 1 时就用 I 型积木横着填补。
因为这个画布最多只有两行 所以这时 我们就可以知道 状态就是 两行的情况 是相等还是第一行多或者第二行多
选择就是 我们如果去选取积木以及摆法 是横着还是竖着还是旋转一下
- 2. 我们如何去定义这个dp数组
- 首先我们可以给我们上述的每个状态标一个号 方便表示
- 1:前 i 列拼完后,两行积木数量相等;
0:前 i 列拼完后,第一行比第二行多 1 个积木块;
2:前 i 列拼完后,第二行比第一行多 1 个积木块。 - 比如说 dp[2][1]=5它是啥意思 我们可以通过上面的分析 大致的描述出来
- 也就是前2列处理完后 在两行数量相等的状态下 拼满画布的方案总数
- 进而我们可以去 得知dp数组的定义
dp[i][j] 表示:处理到画布第 i 列时,处于 j 状态(两行数量关系)下,拼满画布前 i 列的不同方式的数量。最终要求的答案是 dp[N][1],即拼满 2×N 画布且两行积木数量相等的方案数。
- 3 根据选择写出状态转移方程
初始化(basecase)
当没有列(i=0)时,积木都没放,自然两行相等,所以 f[0][1] = 1。
思考:我们已经有了basecase而且知道我们需要的答案是啥
那么我们是不是就可以去确定一下遍历的顺序 即从 1遍历到n 枚举每一列的情况
推导 f[i][1](两行相等):
放两个横 I 型:占两列,所以从 i-2 列的相等状态转移,即 f[i-2][1]。
放一个竖 I 型:占一列,从 i-1 列的相等状态转移,即 f[i-1][1]。
放 L 型(第一行方向):比如在第 i 和 i-1 列拼 L 型,拼之前第二行多 1 个(f[i-1][2])。
放 L 型(第二行方向):拼之前第一行多 1 个(f[i-1][0])。
最终:f[i][1] = [f[i-2][1] + f[i-1][1] + f[i-1][0] + f[i-1][2]] % 1000000007。
推导 f[i][0](第一行多 1 个):
放横 I 型在第一行:填补后,之前是第二行多 1 个(f[i-1][2])。
放 L 型:和前一列组合,拼之前两行相等(f[i-2][1])。
最终:f[i][0] = [f[i-1][2] + f[i-2][1]] % 1000000007。
推导 f[i][2](第二行多 1 个):
和 f[i][0] 对称:f[i][2] = [f[i-1][0] + f[i-2][1]] % 1000000007。
精髓 :总的方案数=所有子问题的方案数之和 希望你能理解这句话
我自己一开始想用动态规划写 其实是很难想的 代码现在看来确实很短 但真的是短小精悍 凝结了很多思考在里面 上面的大部分都是对 洛谷大佬的原文 的进一步完善和补充 希望能帮大家减少一下理解的成本和门槛!!!
solution
#include <bits/stdc++.h>
using namespace std;
const int N=1e7+10;
#define MOD 1000000007
int dp[N][3];//1代表相等 0代表第一行多 2代表第二行多
int n;
int main()
{cin>>n;memset(dp,0,sizeof(dp));//basecase dp[0][1]=1;//第0列没有积木 所以可以理解为摆满的情况有1种for(int i=1;i<=n;i++)//枚举所有列{//我们能从什么状态转移到现在第一行多?无非就是之前i-1列第二行多 但是我们在第一行横着插入了I型积木 所以导致了现在第一行多的状态 //还有就是 原来i-2列是 相等的状态 现在我们倒着插入了 L型积木 也会导致 第一行多 同理我们写出dp[i][2]的状态转移方程dp[i][0]=(dp[i-1][2]+dp[i-2][1])%MOD;dp[i][2]=(dp[i-1][0]+dp[i-2][1])%MOD;//难点就是相等的情况是由什么状态转移而来的 这是关键也是我们需要考虑的 它之前可能相等 可能不相等dp[i][1]=((dp[i-1][1]+dp[i-2][1])%MOD+(dp[i-1][0]+dp[i-1][2])%MOD)%MOD;//为了防止在计算中间就爆int 我们分布取模//(a + b + c + d) % mod = ((a + b) % mod + (c + d) % mod) % mod }cout<<dp[n][1]<<endl;return 0;
}
相关文章:
从搜索丝滑过渡到动态规划的学习指南
搜索&动态规划 前言砝码称重满分代码及思路solution 1(动态规划)solution 2(BFS) 跳跃满分代码及思路solution 1(动态规划)solution 2 (BFS) 积木画满分代码及思路动态规划思路讲解solution 前言 本文主要是通过一些竞赛真题…...
通用文字识别技术的出现,深刻改变信息的处理方式
在数字化浪潮席卷全球的今天,文字作为人类文明最基础的载体,正经历着一场前所未有的技术革命。通用文字识别(OCR,Optical Character Recognition)技术已经从简单的"图片转文字"工具,进化为能够理…...
linux 下du 和 ls-alh 的区别
我一直以为du -m 可以显示文件大小。发现不对。正确的做法你是用ls -alh 来使用...
【k8s学习之CSI】理解 LVM 存储概念和相关操作
鸟哥的 Linux 私房菜 – Quota, Software RAID, LVM, iSCSI 0 | 理解 vg 相关概念 在 Linux LVM(逻辑卷管理) 中,以下是 partition(分区)、PV(物理卷)、VG(卷组)、LV&am…...
【分享开发笔记,赚取电动螺丝刀】使用STM32F103的hal库,采用PWM+DMA发送方式驱动WS2812的RGB彩灯
简单和大家介绍一下本文章的主要内容:使用STM32F103C8最小系统板,使用STM32 cubeMX 6.14版本生成底层的驱动库、结合定时器的PWM 输出功能、使用DMA发送数据的 方式,驱动WS2812 的RGB三色灯。 本次小的DIY所需的物料:stm32f103c8…...
CubeMX配置STM32VET6实现网口通信(无操作系统版-附源码)
下面是使用CubeMX配置STM32F407VET6,实现以太网通讯(PHY芯片为LAN8720)的具体步骤总结: 一、硬件连接方式: 硬件原理图: 使用外部晶振为PHY芯片提供时钟。 STM32F407VET6 与 LAN8720 采用 RMII 模式连接。…...
一种反激式开关电源设计流程
引:随着生产和技术的发展,对环保和能源的要求也越来越高,开关电源的应用也越来越广泛,开关电源电路结构种类繁多,包括单端转换器和双端转换器。本文介绍一种利用反激式变换电路实现5V开关电源的设计方法,以…...
数据结构实验3.2:链栈的基本操作与括号匹配问题
文章目录 一,问题描述二,基本要求三,算法分析(一)链栈的存储结构设计(二)链栈基本操作的时间复杂度分析(三)括号匹配算法分析 四,示例代码五,实验…...
一周学会Pandas2 Python数据处理与分析-NumPy算术运算和统计计算
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 算术运算 数组的灵魂就在于可以进行批量的运算而不是要在循环里面进行元素的运算: 示例: …...
2011年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2011年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
科普:GBDT与XGBoost比较
本文不去讲GBDT与XGBoost算法的原理及算法本身,而是从应用者的角度,对二者比较,以便选择。 XGBoost是GBDT的“工程化增强版”,在保持Boosting核心思想的同时,通过数学优化(二阶导数、正则化)和工…...
大数据技术之 Scala(5)
以下是今天学习的知识点与代码测试: 一、不可变数组与可变数组的转换 说明 arr1.toBuffer //不可变数组转可变数组arr2.toArray //可变数组转不可变数组 arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化arr1.toBuffer 返回结果才是一个可变…...
int 与 Integer 的区别详解
1. 本质区别 特性intInteger类型基本数据类型(Primitive)包装类(Wrapper Class)存储位置栈(或作为对象成员在堆中)堆(对象实例)默认值0null(可能导致 NullPointerExcept…...
初阶数据结构(3)顺序表
Hello~,欢迎大家来到我的博客进行学习! 目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现初始化尾插头插尾删头删查找指定位置之前插入数据删除指定位置的数据销毁 1.线性表 首先我们需要知道的是,…...
智能DNS解析:解决高防IP地区访问异常的实战指南
摘要:针对高防IP在部分地区无法访问的问题,本文设计基于智能DNS的流量调度方案,提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高,智能DNS可…...
瑞芯微RK3568嵌入式AI项目实战:项目方向(三)
基于RK3568的成熟开源项目和实战资源丰富,以下是针对小白的精选推荐及学习路径规划,结合多个开源项目和详细教程,帮助快速入门嵌入式开发: 一、OpenHarmony智能设备开发 1. 凌蒙派-RK3568开发板项目 项目特点:支持Op…...
go游戏后端开发26:红中麻将发牌逻辑
首先,麻将游戏创建房间的逻辑与之前我们做过的“赢三张”创建房间的逻辑是一致的,整体上没有问题。不同之处在于,我们在创建房间时会根据游戏类型来创建对应的“game”,即创建的是麻将的“game”。大家之前写过相关代码࿰…...
DataFrame的遍历、排序、去重与分组
一.遍历 1.1 series遍历 import pandas as pds pd.Series([a,b,c,d,e,f],index[1,2,3,4,5,6])for i in s:print(i) a b c d e f 可见,遍历series会直接拿到其中的值 1.2 DataFrame遍历 1.2.1 直接遍历 import pandas as pd data {name: [Alice, Bob, Charlie]…...
QEMU源码全解析 —— 块设备虚拟化(17)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...
Java 中使用 File 类创建文件
文章目录 Java 中的 File 类一、文件(File)定义 二、File 类的介绍1 创建文件对象的相关构造器2 createNewFile() 的作用3 获取文件相关信息的常用方法4 目录的操作和文件的删除 Java 中的 File 类 在 Java 中,文件和文件流是处理数据输入/输…...
PowerBI-按钮过滤筛选-宜宾五粮液股份有限公司财务分析
下面为Powerbi制作的财务主题数据分析模版,以可视化的效果展示了某股份有限公司的财务关键指标数据,如营业收入、净利润、毛利率和净利率等。以瀑布图的方式展示了利润表项目金额情况,以树图方式展示了企业资产负债数据。另外图表可以进行筛选…...
【PyQt5】QSS样式表如何使用
在 PyQt5 中,使用 QSS(Qt Style Sheets)来为窗口中的各个控件添加样式是非常方便的,类似于 HTML 中的 CSS。你可以通过 QWidget.setStyleSheet() 方法应用 QSS 样式,或者通过 .qss 文件来设置样式。 基本步骤…...
数据结构:用生活中的例子解释 AOE 网中活动的最早和最迟开始时间的含义和计算方法
生活实例:装修房子中的活动安排 假设你要装修一套房子,主要流程如下: 拆旧(活动 A,3 天) → 拆旧完成(事件 X)水电改造(活动 B,4 天) → 水电完…...
第二篇:系统分析师——7-11章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
二十七- Scala
抽象属性和方法 1. 基本语法: 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类 定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性 定义抽象方法:def hello():String //…...
轨检探伤专用一体机平板电脑:为铁路安全保驾护航
在铁路轨道检测领域,高效、精准的探伤设备是保障列车安全运行的核心工具。鲁成伟业针对轨检探伤小车的严苛需求,推出了多款高性能专用一体机平板电脑,以创新的技术设计和卓越的适应性,成为行业标杆解决方案。以下从产品性能、技术…...
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
Python数据爬取
一.example1包下的 注意:需要在终端安装pip3 install -i https://requests.readthedocs.io/en/latest/ requests 1.Python网络爬虫初探-get请求 import requests rrequests.get(https://www.baidu.com) print(r.text) r1requests.get(https://www.jd.com) print…...
【详细解析:如何在小程序中实现动态二维码和预约信息展示】
背景介绍 随着小程序的快速发展,二维码已成为很多线上线下场景中必不可少的工具。在这篇文章中,我将分享如何在小程序中实现一个动态生成二维码并展示预约信息的功能。我们会使用 Vue 和 uni-app 框架,结合自定义的 API,来获取预…...
信息学奥赛一本通 1929:【04NOIP普及组】火星人 | 洛谷 P1088 [NOIP 2004 普及组] 火星人
【题目链接】 ybt 1929:【04NOIP普及组】火星人 洛谷 P1088 [NOIP 2004 普及组] 火星人 【题目考点】 1. 深搜回溯 2. STL next_permutation函数 头文件<algorithm> 函数定义:next_permutation(lb, ub, cmp) lb:区间下界ÿ…...
mysql8.0.29 win64下载
mysql win64安装包 mysql win64安装包下载 mysql win64安装包下载 通过网盘分享的文件:mysql 链接: https://pan.baidu.com/s/1sEOl-wSVtOG5gfIRdt5MXw?pwdgi7i 提取码: gi7i...
C++笔记-string(下)
这篇我们自己来简单实现一下string类中的各个接口,来帮助我们更好地理解string类接口的底层原理。 1.构造函数和析构函数 对于构造函数我们要写两种情况:空字符串和非空字符串 因为我们要自己实现string类,所以就不能用std命名空间…...
Android studio学习之路(六)--真机的调试以及多媒体照相的使用
多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机…...
Airflow集成Lark机器人
🥭1. 实现目标 🕐 通过自定义函数,实现Lark机器人告警功能 🕐 通过Lark机器人代替邮件数据的发送功能 🥭2.自定义函数实现 from airflow import DAG from airflow.operators.python_operator import PythonOperator from airflow.models import Variable import requ…...
【电视软件】小飞电视v2.7.0 TV版-清爽无广告秒换台【永久更新】
软件介绍 小飞电视是一款电视端的直播软件,无需二次付费和登录,资源丰富,高清流畅。具备开机自启、推送功能、自定义直播源、个性化设置及节目预告等实用功能,为用户带来良好的观看体验。基于mytv开源项目二改,涵盖央…...
2025年- H1-Lc109-160. 相交列表--java版
1.题目描述 2.思路 “双指针切换链表头” 思路一:双指针路径对齐 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 让两个指针走相同的总路径长度! 设: 链表 A 独有部分长度是 lenA 链表 B …...
《大模型MCP服务协议与多智能体开发实战10讲》课程大纲
以下是针对大模型MCP(Model Context Protocol)服务协议的多智能体开发系列专栏的10节课课程设计,结合MCP协议特性与多智能体系统的前沿实践,课程结构从协议原理到工程落地,涵盖核心技术、实战案例与前沿趋势࿱…...
C++20 范围库:开启现代 C++ 编程的新篇章
文章目录 一、范围库的核心概念(一)范围(Range)(二)视图(View) 二、范围库的主要特性(一)范围工厂(二)范围适配器(三&…...
基于 Spring Boot 瑞吉外卖系统开发(二)
基于 Spring Boot 瑞吉外卖系统开发(二) 员工登录功能实现 员工登录页面login.html存放在/resources/backend/page/login目录下。 启动项目,在浏览器中通过地址“http://localhost:8080/backend/page/login/login.html”访问员工登录页面。…...
Matlab实现鼠群优化算法优化随机森林算法模型 (ROS-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimizer, ROS)是一种基于老鼠觅食行为的新型元启发式优化算法。ROS通过模拟老鼠在寻找食物时的社会互动和群体智能来探索解空间,旨在高效地找到全局最…...
软件工程第四章习题
一、选择题 1.选择题 (1)在需求分析之前有必要进行( )工作。 A.程序设计 B.可行性研究 C. E-R 分析 D.行为建模 (2)需求分析是一个( ),它应该贯穿于系统的整个生命周期,而不是仅仅属于软件生 命周期早期的一…...
第十九:b+树和b-树
优点一: B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。 优点二: B树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样…...
SQL Server查询性能下降:执行计划不稳定与索引优化
问题现象: SQL Server 2022 中某些关键查询性能突然下降,执行时间从毫秒级增至数秒,日志中未报错,但查询计划显示低效的索引扫描或键查找。 快速诊断 捕获实际执行计划: -- 启用实际执行计划 SET STATISTICS XML, TIME…...
python mcp server最佳实践
文章目录 1、使用fastmcp包还是mcp包?要不要使用uv创建虚拟环境?编写mcp server代码测试cline配置小Tip2、使用stdio还是sse?其实能做的选择不多: 1、使用fastmcp包还是mcp包? 2、使用stdio还是sse? 1、使用fastmcp包还是mcp包? 个人建议选择后者,因为大模型说,后者…...
STM32看门狗应用实战:独立看门狗与窗口看门狗深度解析(下) | 零基础入门STM32第九十五步
主题内容教学目的/扩展视频看门狗什么是看门狗,原理分析,启动喂狗方法,读标志位。熟悉在程序里用看门狗。 师从洋桃电子,杜洋老师 📑文章目录 一、看门狗应用架构分析1.1 系统监控流程图1.2 双看门狗应用场景对比 二、…...
操作符详解
1.操作符的分类 算数操作符: 、- 、 * 、 / 、 %移位操作符:>>、 <<位操作符:& 、| 、^ 赋值操作符:、、-、/、%、<<、>>、&、|、^单目操作符:!、、- -、&、*、、…...
LeetCode 第41~43题
目录 LeetCode 第41题:缺失的第一个正数 LeetCode 第42题:接雨水 LeetCode 第43题:字符串相乘 LeetCode 第41题:缺失的第一个正数 题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的…...
蓝桥杯web工作协调
在 JavaScript 里,Set 是一种内置对象,可存储任何类型的唯一值,无论是原始值还是对象引用。下面是 Set 集合常用方法的介绍: 1. 创建 Set 可以使用 new Set() 来创建一个空的 Set,或者传入一个可迭代对象来初始化 Se…...
夜神模拟器无法下载fiddler证书
提示信息: No root certificate was found. Have you enabled HTTPS traffic decryption in Fiddler yet? 在fiddler安装目录运行以下命令: makecert.exe -r -ss my -n "CNDO_NOT_TRUST_FiddlerRoot, ODO_NOT_TRUST, OUCreated by http://www.fidd…...
OpenCV阈值处理详解
文章目录 一、引言二、阈值处理的基本概念2.1 什么是阈值处理?2.2 为什么需要阈值处理? 三、OpenCV中的阈值处理方法3.1 基本阈值处理3.2 阈值类型详解1. 二进制阈值化 (cv2.THRESH_BINARY)2. 反二进制阈值化 (cv2.THRESH_BINARY_INV)3. 截断阈值化 (cv2…...