关于c++的几个简单算法
一. 动态规划(Dynamic Programming)
难点:状态转移方程的构建和初始化条件的设计
典型问题:01背包问题
分析:
状态定义 dp[i][j] 表示前i个物品放入容量为j的背包的最大价值。状态转移需要判断是否选择当前物品。
#include <iostream>
#include <algorithm>
using namespace std;int main() {int n, capacity;cin >> n >> capacity;int weight[n], value[n];int dp[n+1][capacity+1] = {0}; // 初始化为0for (int i = 0; i < n; i++) cin >> weight[i] >> value[i];for (int i = 1; i <= n; i++) {for (int j = 0; j <= capacity; j++) {if (j >= weight[i-1]) // 能装下当前物品dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i-1]] + value[i-1]);else dp[i][j] = dp[i-1][j]; // 不装当前物品}}cout << dp[n][capacity];return 0;
}
关键点:
-
状态转移方程:
max(不选当前物品,选当前物品) -
时间复杂度:O(n * capacity),需注意数据规模是否允许。
1. 矩阵取数游戏(P1005)
-
题目类型:区间DP + 高精度
-
难点:需要处理大数运算(
__int128或高精度类),状态转移涉及从两端取数的最优解。 -
状态定义:
dp[i][j]表示区间[i, j]取数的最大得分。 -
转移方程:
dp[i][j] = max(dp[i+1][j] * 2 + a[i], dp[i][j-1] * 2 + a[j]); -
代码参考:洛谷P1005题解。
2. 石子合并(P1880)
-
题目类型:区间DP + 环形处理
-
难点:环形问题需展开为链式(复制数组),并枚举分割点
k。 -
状态定义:
dp[i][j]表示合并区间[i, j]的最小/最大代价。 -
转移方程:
dp[i][j] = min(dp[i][k] + dp[k+1][j] + sum[i][j]);
-
代码参考:洛谷区间DP题单。
3. 过河卒(P1002)
-
题目类型:坐标DP + 路径计数
-
难点:处理马的控制点(不可达位置),初始化边界条件。
-
状态定义:
dp[i][j]表示到达(i, j)的路径数。 -
转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1]; // 非马控制点
4. 滑雪(P1434)
-
题目类型:记忆化搜索(DFS + DP)
-
难点:需递归遍历四个方向,记忆化存储已计算的结果。
-
状态定义:
dp[x][y]表示从(x, y)出发的最长滑坡长度。 -
转移方程:
dp[x][y] = max(dfs(nx, ny) + 1); // (nx, ny) 为合法邻接点 -
代码参考:动态规划与记忆化搜索题单。
5. 关路灯(P1220)
-
题目类型:区间DP + 状态附加维度
-
难点:需记录当前区间和位置(左/右端点),分类讨论移动方向。
-
状态定义:
dp[i][j][0/1]表示关闭[i, j]区间的灯后位于左/右端点的最小功耗。 -
转移方程:
dp[i][j][0] = min(dp[i+1][j][0] + cost1, dp[i+1][j][1] + cost2); -
代码参考:洛谷区间DP题单。
6. 合唱队形(P3205)
-
题目类型:区间DP + 双端插入
-
难点:需记录最后插入的元素是左端还是右端。
-
状态定义:
dp[i][j][0/1]表示区间[i, j]以左/右端结尾的排列方案数。 -
转移方程:
if (a[i] < a[i+1]) dp[i][j][0] += dp[i+1][j][0]; -
代码参考:洛谷区间DP题单。
例题说明 :
-
入门题:过河卒(P1002)、数字三角形(P1216)。
-
进阶题:石子合并(P1880)、关路灯(P1220)。
-
高难度题:矩阵取数(P1005)、滑雪(P1434)。
二. 图论 - 最短路径(Dijkstra算法)
难点:优先队列优化和松弛操作的理解
代码示例:
#include <vector>
#include <queue>
using namespace std;const int INF = 0x3f3f3f3f;
vector<pair<int, int>> graph[1001]; // 邻接表:graph[u] = {v, weight}
int dist[1001]; // 最短距离数组void dijkstra(int start) {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;fill(dist, dist + 1001, INF);dist[start] = 0;pq.push({0, start});while (!pq.empty()) {int u = pq.top().second;int d = pq.top().first;pq.pop();if (d > dist[u]) continue; // 已找到更优路径,跳过for (auto &edge : graph[u]) {int v = edge.first, w = edge.second;if (dist[v] > dist[u] + w) { // 松弛操作dist[v] = dist[u] + w;pq.push({dist[v], v});}}}
}
关键点:
-
使用优先队列优化,每次取出距离最小的点。
-
松弛操作:若通过当前点
u到达v更近,则更新dist[v]。 -
注意:Dijkstra不能处理负权边!
1. P4779 【模板】单源最短路径(标准版)
-
题目描述:给定有向图,求从源点出发到所有点的最短路径。
-
算法:Dijkstra堆优化(优先队列实现)。
-
关键点:
-
使用邻接表存图。
-
优先队列优化,时间复杂度为O((V+E)logV)。
-
注意不能在更新时判断
vis,而应在出队时判断。
-
-
代码参考:见洛谷P4779题解。
2. P3371 【模板】单源最短路径(弱化版)
-
题目描述:与P4779类似,但数据范围较小,适合练习基础Dijkstra。
-
算法:Dijkstra(未优化或优先队列优化)。
-
关键点:
-
弱化版允许使用未优化的Dijkstra(O(V²))。
-
输出要求中,不可达点输出2³¹-158。
-
-
代码参考:见洛谷P3371题解。
3. P1339 Heat Wave G
-
题目描述:无向图,求从起点到终点的最短路。
-
算法:Dijkstra或SPFA(题目未禁用SPFA时)。
-
关键点:
-
使用邻接矩阵存图(适合稠密图)。
-
注意无向图的边需双向处理。
-
-
代码参考:见洛谷P1339题解。
4. P1629 邮递员送信
-
题目描述:求从源点到所有点的最短路及所有点返回源点的最短路之和。
-
算法:Dijkstra + 反向建图。
-
关键点:
-
正向图跑一次Dijkstra,反向图再跑一次。
-
反向图可将“返回路径”转化为单源最短路问题。
-
-
代码参考:见洛谷题单图论2-2。
5. P2296 寻找道路
-
题目描述:在满足路径点出边均与终点连通的条件下,求最短路径。
-
算法:拓扑排序 + Dijkstra/BFS。
-
关键点:
-
先用反向图拓扑排序筛选合法点。
-
再在合法点上跑最短路6。
-
-
代码参考:见洛谷P2296题解。
6. P1144 最短路计数
-
题目描述:求从起点到各点的最短路径条数(边权为1)。
-
算法:BFS或Dijkstra(带DP统计)。
-
关键点:
-
若
dis[y] == dis[x]+1,则累加路径数。 -
需模100003输出4。
-
-
代码参考:见洛谷题单图论2-2。
| 题目编号 | 名称 | 算法 | 难度 |
|---|---|---|---|
| P4779 | 单源最短路径(标准版) | Dijkstra堆优化 | 普及+/提高 |
| P3371 | 单源最短路径(弱化版) | Dijkstra基础 | 普及- |
| P1339 | Heat Wave G | Dijkstra/SPFA | 普及 |
| P1629 | 邮递员送信 | Dijkstra + 反向图 | 普及+/提高 |
| P2296 | 寻找道路 | 拓扑排序 + 最短路 | 提高+/省选- |
| P1144 | 最短路计数 | BFS/Dijkstra + DP | 普及+/提高 |
例题说明: 建议按顺序练习,从模板题(P3371、P4779)开始,逐步挑战综合应用题(如P2296)。更多题目可参考洛谷题单图论2-2。
三. 深度优先搜索(DFS)与剪枝
难点:剪枝条件的合理设计
典型问题:全排列问题
代码示例:
#include <iostream>
using namespace std;int n, path[10];
bool visited[10];void dfs(int step) {if (step == n) { // 终止条件for (int i = 0; i < n; i++) cout << path[i] << " ";cout << endl;return;}for (int i = 1; i <= n; i++) {if (!visited[i]) { // 剪枝:已用过的数字不再选visited[i] = true;path[step] = i;dfs(step + 1);visited[i] = false; // 回溯}}
}int main() {cin >> n;dfs(0);return 0;
}
关键点:
-
使用
visited数组避免重复选择,实现剪枝。 -
回溯时恢复状态(
visited[i] = false)。
四. 并查集(Union-Find)
难点:路径压缩和按秩合并的优化
代码示例:
int parent[1001];
int rank[1001];void init() {for (int i = 0; i < 1001; i++) {parent[i] = i;rank[i] = 1;}
}int find(int x) { // 路径压缩if (parent[x] != x)parent[x] = find(parent[x]);return parent[x];
}void union_set(int x, int y) { // 按秩合并int rootx = find(x), rooty = find(y);if (rootx == rooty) return;if (rank[rootx] > rank[rooty]) parent[rooty] = rootx;else {parent[rootx] = rooty;if (rank[rootx] == rank[rooty]) rank[rooty]++;}
}
关键点:
-
find函数通过递归实现路径压缩,降低树高。 -
union_set根据秩的大小合并,避免树退化。
五. 贪心算法(Greedy)
难点:正确性证明和贪心策略的选择
典型问题:区间调度(选择最多不重叠区间)
代码示例:
#include <vector>
#include <algorithm>
using namespace std;struct Interval {int start, end;
};bool compare(Interval &a, Interval &b) {return a.end < b.end; // 按结束时间排序
}int maxIntervals(vector<Interval> intervals) {sort(intervals.begin(), intervals.end(), compare);int count = 0, last_end = -1;for (auto &itv : intervals) {if (itv.start >= last_end) {count++;last_end = itv.end;}}return count;
}
关键点:
-
贪心策略:优先选择结束时间早的区间。
-
正确性证明:局部最优(选最早结束)导致全局最优。
总结
-
动态规划:从简单模型(如背包)入手,理解状态定义。
-
图论:熟练Dijkstra和Floyd算法的应用场景。
-
搜索:合理剪枝,避免暴力超时。
-
并查集:必须掌握路径压缩优化。
-
贪心:多练习经典问题,如区间问题、哈夫曼编码等。
相关文章:
关于c++的几个简单算法
一. 动态规划(Dynamic Programming) 难点:状态转移方程的构建和初始化条件的设计 典型问题:01背包问题 分析: 状态定义 dp[i][j] 表示前i个物品放入容量为j的背包的最大价值。状态转移需要判断是否选择当前物品。 #i…...
WPF MergedDictionaries详解
在 WPF 中,ResourceDictionary.MergedDictionaries 是一个非常重要的特性,用于将多个资源字典(ResourceDictionary)合并到一个主资源字典中。这种机制使得资源的管理和复用变得更加灵活和高效。 1. MergedDictionaries 的作用 Me…...
一套云HIS系统源码,系统融合HIS与EMR,基于云端部署,采用B/S架构与SaaS模式
云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级及以下医院可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核…...
DisplayPort(DP)详解
一、DisplayPort的定义与核心特性 DisplayPort(DP) 是由 视频电子标准协会(VESA) 制定的 高性能数字音视频接口,专为高分辨率显示器和多屏应用设计。其核心特性包括: 高带宽:DisplayPort 2.0支…...
C++数据结构(搜索二叉树)
1.二叉树搜索的概念 二叉搜索数也成为二叉排序树,它或者是一颗空树,或者是满足以下性质的树: 1.若他的左子树不为空,则左子树上的所有节点的值都小于等于根节点的值。 2.若他的右子树不为空,则右子树上的所有节点的值…...
OpenCV图像拼接(6)图像拼接模块的用于创建权重图函数createWeightMap()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…...
Micropython RPI-PICO 随记-双PICO串口传数据
开发环境 MCU:双 Pico1(无wifi版),串口相连,需要共地使用固件:自编译版本开发环境:MacBook Pro Sonoma 14.5开发工具:Thonny 4.1.6开发语言:MicroPython 1.24.0 上位机…...
炫酷的HTML5粒子动画特效实现详解
炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...
YoloV8训练和平精英人物检测模型
概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…...
BC93 公务员面试
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言练习题分享 🌍文章目入 #include <stdio.h> int main() {int score 0, max 0, min 100, sum 0, count 0; while (scanf("%d", &score) ! EOF){…...
3.0 Disruptor的使用介绍(一)
Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …...
基础实验2-2.1 整数的分类处理
基础实验2-2.1 整数的分类处理 - 浙大版《数据结构学习与实验指导(第2版)》题目集 (pintia.cn) 给定 N 个正整数,要求你从中得到下列三种计算结果: A1 能被 3 整除的最大整数A2 存在整数 K 使之可以表示为 3K1 的整数的个数A3…...
[深度学习]图像分类项目-食物分类
图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…...
有价值的面试问题
迅雷一面 都是c和网络问题 了解epoll吗?解释下水平触发和边缘触发,医院的叫号系统应该算哪一种 c类a有成员b,成员b调用了a的函数,但是a不小心把b的成员删除了,会发生什么,怎么解决 c类a有一个static的函数…...
禁用ONLY_FULL_GROUP_BY模式
这是由于MySQL启用了ONLY_FULL_GROUP_BY模式导致的。以下是禁用该模式的三种方法,结合你的需求选择最合适的方案: 一、临时禁用(重启后失效) 1. 当前会话禁用 直接在SQL客户端执行以下命令,仅对当前数据库连接有效&…...
SAP 获取RFC的WSDL文件
主要是CPI要用到WSDL文件做mapping,客户的SAP服务器不一定直接可在浏览器访问http或者https的地址,所以在SAP里面开发程序内部调用地址获取WSDL文件 *&---------------------------------------------------------------------* *& Report YXX_…...
SQLite优化实践
1. 启用写入批处理 使用事务将多条插入操作包装在一起,这样可以减少磁盘I/O和日志的写入。 BEGIN TRANSACTION; -- 执行多个INSERT语句 COMMIT;通过将多个插入操作包装在一个事务中,可以显著减少每次写入数据库时的磁盘I/O操作。 2. 使用更大的页大小…...
56.fm解调最简单的方法过零检测,如何确定计时器的更新速率
,...
java8循环解压zip文件---实现Excel文件数据追加
java8循环追加Excel数据 实际遇到问题:定期获取zip文件,zip文件内有几个固定模板的Excel文件,有的Excel文件可能还包含多个sheet。 有段时间一次性获取到好几个zip包,需要将这些包都解压,并且按照不同的文件名、sheet进…...
基于SpringBoot的电影售票系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
SQL Server 2022 安装问题
一、安装与配置问题 1. SQL Server 2022 安装失败怎么办? 常见原因: 硬件或操作系统不满足最低要求(如内存、磁盘空间不足)。未关闭防火墙或杀毒软件。之前版本的 SQL Server 残留文件未清理。 解决方案: 确保硬件配…...
MySQL 8.0.41安装教程(附安装包)mysql8.0.41图文详细安装教程
文章目录 前言一、MySQL 8.0.41下载安装包二、MySQL 8.0.41安装教程1.启动安装程序2.选择安装模式3.选定安装组件4.确认安装设置5.执行安装操作6.安装进行中7.设置数据库密码8.继续点击下一步9.执行配置操作10.完成配置11. 再次点击下一步12.结束安装向导 三、MySQL 8.0.41配置…...
React Router使用方法
目录 简介React Router的三种使用模式声明模式数据模式框架模式 React Router7声明模式使用方法在入口文件引入BrowserRouter配置一个路由组件管理路由将路由组件引入App.tsx嵌套路由链接式路由导航 \ 和 \<Link>编程式路由导航 简介 React Router 是 React 的多策略路由…...
2025年陕西省各市秦创原产业创新聚集区(机器人、羊乳、苹果)“四链”融合项目申报补贴要求和时间流程
征集2025年陕西省各市秦创原产业创新聚集区(机器人、羊乳、苹果)“四链”融合项目申报补贴要求和时间流程,更多详情请大家参考下文!西安市、宝鸡市、咸阳市、铜川市、渭南市、延安市、榆林市、汉中市、安康市、商洛市10市各地需要…...
深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
文章目录 1. 什么是 std::bind_front?2. 使用 std::bind_front2.1 基本用法2.2 绑定多个参数 3. 优势与特点3.1 简化代码3.2 支持可调用对象3.3 支持完美转发 4. 实际应用场景4.1 事件处理4.2 算法通用化4.3 成员函数调用 5. 总结 在现代 C 编程中,函数绑…...
python裁剪nc文件数据
问题描述: 若干个nc文件储存全球的1850-2014年月尺度的mrro数据(或其他数据),从1850-1到2014-12一共1980个月,要提取出最后35年1980.1~2014.12年也就是420个月的数据。 代码实现 def aaa(input_file,output_file,bianliang,start_index,en…...
数据治理之数据仓库
本文主要阐述了数据仓库在大数据平台项目中的地位和重要性,对目前市场上数据仓库主流设计进行分析说明,讲述了通用数据仓库设计上所应考虑的因素。 数据仓库介绍 数据仓库是一个过程而不是一个项目;数据仓库是一个环境,而不是一件产品。数据仓库提供用户用于决策支持的当前…...
QILSTE H6-108QFO高亮橙光LED灯珠 发光二极管LED
# H6-108QFO LED 产品参数解析与应用指南 ## 一、产品概述 H6-108QFO 是一款尺寸为 1.6x0.8x0.55mm 的高亮橙光 LED 产品,采用透明平面胶体设计,符合 EIA 规范标准包装,达到环保 ROHS 要求,防潮等级为 Level 3,适用于…...
2503C++,C++标准的执行
最优雅的应该是c26刚刚引入的std::execution,通过sender/receiver模型和常用的异步算法来简化调用异步逻辑,还可随时改成协程. #include <stdexec/execution.hpp> #include <exec/static_thread_pool.hpp> int main() {exec::static_thread_pool pool(3);auto sch…...
CSS网格布局Grid
目录 一、Grid 网格布局 1.Grid 布局基础 2.网格容器属性 3.网格项目属性 4.高级功能 5.典型应用场景 6.最佳实践 二、Flex和Grid对比 示例: 一、Grid 网格布局 CSS Grid 是一种强大的二维布局系统,能够以行和列的方式精确控制网页布局。它比传…...
