动态规划与图论:oj104-106算法题精解
1. 题目背景与核心考察点解析最近在算法练习平台上频繁看到oj104、oj105、oj106这三道经典题目的讨论。作为算法进阶路上的必经关卡这三道题涵盖了动态规划、图论和数据结构等核心知识点。本文将结合我个人刷题经验深入剖析这三道题的解题思路和实现细节。oj104通常考察的是动态规划中的背包问题变种需要处理带有特殊限制条件的物品选择问题。oj105则偏向图论中的最短路径算法应用常涉及Dijkstra或Floyd算法的变形。而oj106往往与高级数据结构相关可能需要实现特殊的树结构或并查集优化。提示这三道题在各大公司的笔试中出现频率较高建议至少掌握两种不同解法2. oj104 动态规划解法详解2.1 问题重述与建模oj104的典型描述是给定一组物品每个物品有重量w[i]和价值v[i]在背包容量限制为W的情况下要求选择的物品总重量不超过W且满足某种特殊条件如某些物品必须选/不能同时选等求最大总价值。这类问题的关键在于识别出基础背包模型01背包/完全背包/多重背包正确处理附加的限制条件设计合适的状态转移方程2.2 状态定义与转移方程以最常见的01背包变种为例我们定义dp[i][j]表示考虑前i个物品当前背包重量为j时的最大价值。基础状态转移方程为dp[i][j] max(dp[i-1][j], dp[i-1][j-w[i]] v[i])当遇到必须选第k个物品的限制时需要预处理先强制选择该物品调整剩余容量然后在剩余物品上运行标准背包算法2.3 空间优化技巧通过滚动数组可以将空间复杂度从O(nW)优化到O(W)dp [0]*(W1) for i in range(n): for j in range(W, w[i]-1, -1): dp[j] max(dp[j], dp[j-w[i]] v[i])注意逆序遍历是为了防止同一物品被多次选择3. oj105 图论问题实战3.1 题目特征分析oj105通常给出一个带权有向图要求计算特定节点间的最短路径处理存在负权边的情况满足额外的访问限制条件3.2 Dijkstra算法的适用与限制标准Dijkstra算法实现import heapq def dijkstra(graph, start): distances {node: float(inf) for node in graph} distances[start] 0 heap [(0, start)] while heap: current_dist, current_node heapq.heappop(heap) if current_dist distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance current_dist weight if distance distances[neighbor]: distances[neighbor] distance heapq.heappush(heap, (distance, neighbor)) return distances当图中存在负权边时Dijkstra算法可能失效此时应改用SPFA或Bellman-Ford算法。3.3 处理特殊限制条件常见变种包括途径特定节点的最短路径分段计算A→C→B shortest(A,C) shortest(C,B)边权随时间变化需要将时间维度纳入状态定义限制路径边数使用分层图技术4. oj106 数据结构应用4.1 题目类型识别oj106通常涉及以下数据结构并查集带权或扩展域线段树/树状数组Trie树/后缀自动机平衡二叉搜索树4.2 并查集高级应用带权并查集实现示例class DSU: def __init__(self, n): self.parent list(range(n)) self.rank [0]*n self.weight [0]*n # 维护节点到父节点的权值 def find(self, x): if self.parent[x] ! x: orig_parent self.parent[x] self.parent[x] self.find(self.parent[x]) self.weight[x] self.weight[orig_parent] return self.parent[x] def union(self, x, y, w): x_root self.find(x) y_root self.find(y) if x_root y_root: return if self.rank[x_root] self.rank[y_root]: self.parent[x_root] y_root self.weight[x_root] w - self.weight[x] self.weight[y] else: self.parent[y_root] x_root self.weight[y_root] -w - self.weight[y] self.weight[x] if self.rank[x_root] self.rank[y_root]: self.rank[x_root] 14.3 线段树优化技巧动态开点线段树实现区间查询class Node: __slots__ [l,r,left,right,val] def __init__(self, l, r): self.l l self.r r self.left None self.right None self.val 0 class SegmentTree: def __init__(self, l, r): self.root Node(l, r) def update(self, node, idx, val): if node.l node.r: node.val val return mid (node.l node.r) // 2 if idx mid: if not node.left: node.left Node(node.l, mid) self.update(node.left, idx, val) else: if not node.right: node.right Node(mid1, node.r) self.update(node.right, idx, val) node.val (node.left.val if node.left else 0) \ (node.right.val if node.right else 0) def query(self, node, l, r): if not node or node.r l or node.l r: return 0 if l node.l and node.r r: return node.val return self.query(node.left, l, r) self.query(node.right, l, r)5. 常见错误与调试技巧5.1 oj104典型错误初始化不正确忘记将dp[0][0]初始化为0错误地将所有位置初始化为-INF边界条件处理不当没有检查j-w[i]是否越界特殊限制条件判断顺序错误调试建议打印中间状态矩阵用小规模测试用例手动验证5.2 oj105易错点优先队列实现错误忘记处理重复节点距离更新条件不完整负权环检测遗漏Bellman-Ford算法中迭代次数不足没有正确判断松弛操作是否还能继续调试技巧可视化图的邻接表表示检查每个节点的入队/出队次数5.3 oj106常见问题并查集路径压缩错误忘记维护权值关系压缩时父节点更新顺序错误线段树更新延迟懒标记下传不及时区间划分边界条件错误调试方法为每个操作添加日志输出验证小规模输入的中间结果6. 性能优化策略6.1 oj104优化方向二进制拆分优化多重背包将物品数量拆分为1,2,4,...的幂次组合转化为01背包问题求解单调队列优化维护一个滑动窗口最值将时间复杂度从O(nW)降到O(n)6.2 oj105加速技巧双向Dijkstra从起点和终点同时开始搜索当两边的优先队列相遇时终止A*启发式搜索设计合理的启发函数h(x)优先扩展最有希望的节点6.3 oj106高效实现并查集路径压缩优化def find(self, x): if self.parent[x] ! x: self.parent[x] self.find(self.parent[x]) # 路径压缩 return self.parent[x]线段树懒标记优化将区间更新延迟到实际查询时执行减少不必要的节点更新操作在实际刷题过程中建议先写出基础解法再逐步引入优化。我个人的经验是先确保正确性再考虑优化往往能避免很多难以发现的边界条件错误。对于这三道题至少要练习到能在30分钟内完成编码和基本测试的程度这样才能在笔试或面试中游刃有余。

相关新闻

MinHash算法性能优化.docx

MinHash算法性能优化.docx

MinHash算法性能优化 时间:2026年3月11日## MinHash算法介绍 MinHash(Minimum Hashing,最小哈希)是一种用于快速估算两个集合相似度的算法,属于局部敏感哈希(LSH)技术的一种。### 核心原理 M…

2026/8/4 1:30:15 阅读更多 →
视频内容转换成文字用什么工具?2026年七款视频音频转文字工具实测盘点

视频内容转换成文字用什么工具?2026年七款视频音频转文字工具实测盘点

上个月部门季度复盘会开了快两个小时,录音文件扔在手机里一直没动。leader周三突然要一份会议纪要,我翻出那条录音,从头拖到尾整整听了两遍,边听边敲键盘,手指都快抽筋了。那一刻脑子里只剩一个念头:有没有…

2026/8/4 1:30:14 阅读更多 →
采购降本增效:战略寻源与数字化工具实践

采购降本增效:战略寻源与数字化工具实践

1. 采购降本增效的核心价值与挑战采购部门在企业运营中扮演着"成本阀门"的关键角色。根据行业调研数据,采购成本每降低1%,企业利润平均可提升5-8%。但现实中,超过60%的采购团队仍陷在"救火式"工作模式中——供应商交货延…

2026/8/4 1:29:14 阅读更多 →

最新新闻

langgraph教程系列-08-让agent记住过去-长期记忆

langgraph教程系列-08-让agent记住过去-长期记忆

本文是「LangGraph 教程系列」第 8 篇。写作时基于 langgraph 1.2.10、langchain 1.3.14、langchain-openai 1.4.1、Python 3.12。配套代码仓库 https://github.com/wxj006007/deep-research-assistant ,本篇对应 tag v2.2。上一版的研究助手已经会停下来等人审批。…

2026/8/4 2:08:30 阅读更多 →
从零部署技术向盲盒应用:全流程指南与API集成实践

从零部署技术向盲盒应用:全流程指南与API集成实践

这次我们来看一个名为“进来开盲盒!”的项目。从标题来看,这很可能是一个结合了趣味性与技术实现的应用,其核心玩法是模拟线上“开盲盒”的体验。在技术层面,这类项目通常会涉及前端交互、后端逻辑处理、以及可能的数据随机化算法…

2026/8/4 2:08:30 阅读更多 →
15(S)-HETE-biotin标记技术原理与实验操作指南

15(S)-HETE-biotin标记技术原理与实验操作指南

1. 项目概述15(S)-HETE-biotin是一种重要的生物素标记化合物(CAS号:1217461-45-4),在生命科学研究领域具有广泛应用价值。这种化合物通过将生物素分子与15(S)-羟基二十碳四烯酸[15(S)-HETE]共价连接而成,主要用于蛋白质…

2026/8/4 2:08:30 阅读更多 →
89-Prompt自动优化-DSPy框架-元Prompt-APE算法

89-Prompt自动优化-DSPy框架-元Prompt-APE算法

文章目录【89.PythonAI】Prompt自动优化:让AI帮你写Prompt,比你自己写的好10倍导入语1 ~> 人肉调参的天花板1.1 手工优化为什么低效1.2 自动优化的统一范式2 ~> 路线一:元Prompt——五分钟上手的轻量方案2.1 什么是元Prompt2.2 迭代循环…

2026/8/4 2:08:30 阅读更多 →
MHmarkets:从风控思路切入的方法盘点

MHmarkets:从风控思路切入的方法盘点

对多数外汇相关用户来说,判断平台并不需要复杂术语,关键在于信息能否被快速理解、关键提示是否容易找到、服务体验是否稳定一致。以MHmarkets为例,这里聚焦这些更贴近实际使用的亮点与细节。在外汇相关服务中,读者最在意的通常是信…

2026/8/4 2:08:29 阅读更多 →
Vue.js养老院医疗护理系统开发实践与优化

Vue.js养老院医疗护理系统开发实践与优化

1. 项目概述:Vue养老院医疗护理理疗系统开发实录养老机构的数字化转型正在加速推进,而医疗护理系统作为核心支撑平台,其开发质量直接影响着老年人的健康管理效率。这个基于Vue.js的前端项目,正是为解决传统养老院纸质化办公、信息…

2026/8/4 2:07:29 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →