首页/新闻资讯/正文详情

算法竞赛题解:队列、栈、动态规划与图论实战

发布时间:2026/11/4 20:32:36 来源:云帆数科 栏目:资讯中心
算法竞赛题解:队列、栈、动态规划与图论实战
1. 题目背景与解题思路概述这组题目来自洛谷在线评测平台涵盖多种算法题型。作为算法竞赛选手我经常通过刷题来保持手感。最近集中解决了P14923、P11967等9道题目发现它们虽然编号分散但涉及的知识点很有代表性。下面我将按照题目难度和知识点分类分享我的解题思路和代码实现。2. 基础数据结构题解2.1 P10289 队列模拟这道题考察基本的队列操作。题目要求模拟一个队列支持入队、出队和查询队首元素三种操作。#include queue using namespace std; int main() { queueint q; int n, op, x; cin n; while(n--) { cin op; if(op 1) { cin x; q.push(x); } else if(op 2) { if(!q.empty()) q.pop(); } else { if(q.empty()) cout Empty\n; else cout q.front() \n; } } return 0; }注意题目没有说明操作是否合法需要自行处理空队列时的出队和查询操作。2.2 P10264 栈的应用这是一道典型的栈应用题目要求检查括号匹配。我的解法是用栈来跟踪未匹配的左括号。#include stack #include string using namespace std; bool isValid(string s) { stackchar st; for(char c : s) { if(c ( || c [ || c {) { st.push(c); } else { if(st.empty()) return false; char top st.top(); if((c ) top ! () || (c ] top ! [) || (c } top ! {)) { return false; } st.pop(); } } return st.empty(); }3. 动态规划专题3.1 P10725 背包问题变种这道题是01背包的变形额外增加了物品数量的限制。我采用三维DP来解决int dp[101][101][101]; // dp[i][j][k]表示前i个物品总重量j总数量k的最大价值 int solve() { int N, W, K; cin N W K; vectorint w(N1), v(N1); for(int i1; iN; i) cin w[i] v[i]; for(int i1; iN; i) { for(int j0; jW; j) { for(int k0; kK; k) { if(j w[i] k 1) { dp[i][j][k] max(dp[i-1][j][k], dp[i-1][j-w[i]][k-1] v[i]); } else { dp[i][j][k] dp[i-1][j][k]; } } } } return dp[N][W][K]; }3.2 P13019 最长公共子序列经典LCS问题我使用了带路径还原的解法string LCS(string s1, string s2) { int m s1.size(), n s2.size(); vectorvectorint dp(m1, vectorint(n1)); for(int i1; im; i) { for(int j1; jn; j) { if(s1[i-1] s2[j-1]) { dp[i][j] dp[i-1][j-1] 1; } else { dp[i][j] max(dp[i-1][j], dp[i][j-1]); } } } // 路径还原 string res; int i m, j n; while(i 0 j 0) { if(s1[i-1] s2[j-1]) { res.push_back(s1[i-1]); i--; j--; } else if(dp[i-1][j] dp[i][j-1]) { i--; } else { j--; } } reverse(res.begin(), res.end()); return res; }4. 图论算法题解4.1 P11967 最短路径问题这道题是标准的最短路径问题我使用了Dijkstra算法#include vector #include queue using namespace std; typedef pairint, int pii; vectorint dijkstra(vectorvectorpii graph, int start) { int n graph.size(); vectorint dist(n, INT_MAX); dist[start] 0; priority_queuepii, vectorpii, greaterpii pq; pq.push({0, start}); while(!pq.empty()) { auto [d, u] pq.top(); pq.pop(); if(d dist[u]) continue; for(auto [v, w] : graph[u]) { if(dist[v] dist[u] w) { dist[v] dist[u] w; pq.push({dist[v], v}); } } } return dist; }提示使用优先队列时要注意处理重复节点当从队列中取出一个节点时如果它的距离值已经比当前记录的大可以直接跳过。4.2 P13020 拓扑排序这道题要求判断一个有向图是否有环可以通过拓扑排序来实现bool hasCycle(int n, vectorvectorint edges) { vectorvectorint graph(n); vectorint inDegree(n, 0); for(auto e : edges) { graph[e[0]].push_back(e[1]); inDegree[e[1]]; } queueint q; for(int i0; in; i) { if(inDegree[i] 0) q.push(i); } int cnt 0; while(!q.empty()) { int u q.front(); q.pop(); cnt; for(int v : graph[u]) { if(--inDegree[v] 0) { q.push(v); } } } return cnt ! n; }5. 高级数据结构应用5.1 P14923 线段树应用这道题需要区间查询和区间更新我实现了带懒标记的线段树class SegmentTree { private: vectorint tree, lazy; int n; void pushDown(int node, int l, int r) { if(lazy[node] ! 0) { int mid (l r) / 2; tree[node*2] lazy[node] * (mid - l 1); lazy[node*2] lazy[node]; tree[node*21] lazy[node] * (r - mid); lazy[node*21] lazy[node]; lazy[node] 0; } } void updateRange(int node, int l, int r, int L, int R, int val) { if(R l || L r) return; if(L l r R) { tree[node] val * (r - l 1); lazy[node] val; return; } pushDown(node, l, r); int mid (l r) / 2; updateRange(node*2, l, mid, L, R, val); updateRange(node*21, mid1, r, L, R, val); tree[node] tree[node*2] tree[node*21]; } int queryRange(int node, int l, int r, int L, int R) { if(R l || L r) return 0; if(L l r R) return tree[node]; pushDown(node, l, r); int mid (l r) / 2; return queryRange(node*2, l, mid, L, R) queryRange(node*21, mid1, r, L, R); } public: SegmentTree(int size) : n(size) { tree.resize(4*n, 0); lazy.resize(4*n, 0); } void update(int L, int R, int val) { updateRange(1, 1, n, L, R, val); } int query(int L, int R) { return queryRange(1, 1, n, L, R); } };5.2 P14924 并查集应用这道题考察并查集的高级应用需要支持撤销操作class DSU { private: vectorint parent, size; stackpairint, int history; public: DSU(int n) { parent.resize(n); size.resize(n, 1); for(int i0; in; i) parent[i] i; } int find(int u) { while(parent[u] ! u) u parent[u]; return u; } bool unite(int u, int v) { u find(u); v find(v); if(u v) return false; if(size[u] size[v]) swap(u, v); history.push({u, v}); parent[v] u; size[u] size[v]; return true; } void rollback() { if(history.empty()) return; auto [u, v] history.top(); history.pop(); parent[v] v; size[u] - size[v]; } };6. 解题技巧与优化策略在解决这组题目时我总结了一些通用技巧输入输出优化对于C在数据量较大时使用ios::sync_with_stdio(false); cin.tie(0);可以显著加快IO速度。调试技巧对于复杂的算法可以编写小数据生成器和对拍程序验证代码正确性。复杂度分析实现算法前先估算时间复杂度确保不会超时。例如n1e5时O(nlogn)算法通常可行O(n^2)则不行。空间优化动态规划问题中如果当前状态只依赖于前一个状态可以压缩空间到一维。边界处理特别注意数组越界、空容器访问等边界情况这是比赛中常见的失分点。7. 常见错误与调试方法在解决这些题目时我遇到了几个典型错误数组越界在P10725中最初没有检查物品数量k的下限导致数组访问越界。优先级队列使用错误在Dijkstra实现中忘记处理重复节点导致效率降低。浮点数精度问题虽然这组题目中没有涉及但在其他题目中需要注意比较浮点数时使用epsilon。递归爆栈深度优先搜索时对于大数据量需要使用非递归实现或手动设置栈大小。调试方法使用小样例手动模拟算法执行过程输出中间变量检查状态转移是否正确使用assert验证不变量对于WA的测试点构造边界案例测试8. 题目扩展与变种思考这些题目都可以进一步扩展P10289可以增加双端队列操作或者限制队列最大容量。P10725可以改为完全背包或多重背包问题。P13019可以扩展为求所有LCS而不仅是一个。P11967可以增加负权边改用SPFA算法。P14923可以支持更多的区间操作如区间最值、区间gcd等。对于想进一步提高的选手我建议尝试实现这些扩展版本并比较不同解法的效率差异。

相关推荐

Hive与HBase大数据存储技术对比与选型指南
Hive与HBase大数据存储技术对比与选型指南

1. 大数据存储技术选型困境 在数据量呈指数级增长的今天,企业常常面临一个关键抉择:如何选择最适合自身业务场景的大数据存储方案?Hive和HBase作为两种主流的大数据存储技术,各自拥有独特的设计哲学和应用场景。我曾在多个PB级数据… · 2026/11/4 20:32:36

车站售票系统数据库设计:从3NF建模到并发事务落地
车站售票系统数据库设计:从3NF建模到并发事务落地

简介:本资源是广东工业大学数据库系统课程设计的完整实践方案——车站售票管理系统,面向高校数据库初学者与课程设计学生,解决车票售卖、退票、多维度查询统计及后台运维等典型数据库应用问题。压缩包共100个文件,含21个Java源文件… · 2026/11/4 20:32:36

Linux 下用 yum/apt 在线安装 Nginx 完整指南与避坑
Linux 下用 yum/apt 在线安装 Nginx 完整指南与避坑

装个 Nginx 而已,我见过太多人卡在第一步:一台刚交付的机器,系统装完,SSH 进去,nginx -v报 command not found,然后开始搜"nginx 安装教程",翻到一篇让下载.tar.gz编译的,… · 2026/11/4 20:32:36

微服务架构下基于Nacos的轻量级任务调度方案设计与实现
微服务架构下基于Nacos的轻量级任务调度方案设计与实现

1. 项目背景与核心问题在微服务架构中,任务调度系统是不可或缺的基础组件。XXL-JOB作为国内广泛使用的开源调度系统,以其稳定性和功能完整性赢得了大量用户的青睐。然而,在全面采用NacosSpring Cloud Alibaba技术栈的架构中,我们发… · 2026/11/4 21:12:16

MMORPG服务端3.2.2本地搭建:认证、世界服与数据库排错
MMORPG服务端3.2.2本地搭建:认证、世界服与数据库排错

3.2.2 这个版本号,在游戏服务端研究的圈子里算是一个绕不开的坐标。它处在客户端协议还没有大规模加密、服务端模拟框架的文档相对完整、社区沉淀下来的调试经验也足够多的那个时间段,所以很多人想弄明白“一个 MMORPG 的服务端到底是怎么跑起来的”&… · 2026/11/4 21:12:16

AI智能理论到工程实践:泛化、缩放定律与排查方法
AI智能理论到工程实践:泛化、缩放定律与排查方法

“AI智能的理论的概述”这个说法,第一次看到的时候我愣了几秒。它不像一本教材的目录,也不像某个具体技术的名字,更像是有人想把一整套关于智能的假设、模型和边界条件塞进一句话里。我在这个方向待了十来年,从最早手推感知机的权… · 2026/11/4 21:12:16

系统音频捕获+实时字幕翻译:LiveCaptions-Translator 实战配置与避坑指南
系统音频捕获+实时字幕翻译:LiveCaptions-Translator 实战配置与避坑指南

实时语音翻译这件事,我前后折腾过不下五套方案,从最早的手动转录加翻译拼接,到后来的本地模型串联,再到现成的桌面工具,踩过的坑能写满两页纸。LiveCaptions-Translator 是我目前留在机器上长期使用的一套,… · 2026/11/4 21:12:16

Linux 上 Miniconda 安装配置全攻略:环境隔离与避坑指南
Linux 上 Miniconda 安装配置全攻略:环境隔离与避坑指南

1. 为什么我不推荐直接用系统自带的 Python 很多人第一次在 Linux 上装 Python 环境,习惯性敲 sudo apt install python3 ,装完发现版本是系统仓库里那个老掉牙的 3.8 或者 3.10,然后 pip 装包时各种权限报错,最后被迫 sudo pi… · 2026/11/4 21:12:16

N4系统集成避坑:协议矩阵、Device点数与BACnet IP开放
N4系统集成避坑:协议矩阵、Device点数与BACnet IP开放

简介:《N4系统集成介绍-2021.pdf》面向楼宇自控、弱电集成与IBMS对接人员,聚焦霍尼韦尔N4平台在BA系统及第三方设备接入中的架构理解与接口开放选型。文档以NIAGARA4集成架构为主线,梳理冷热源、空调、变配电、电扶梯、能源计费、消防、智能照… · 2026/11/4 21:11:14

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码