- 博客(31)
- 收藏
- 关注
原创 C++ 控制台错误码
浮点无效操作(如对负数开平方)真有人会犯这样的错误码?: 浮点下溢(结果太小)没有用too2。: 浮点上溢(结果太大)没有用too。: 用户主动终止 Ctrl+C。没有用,其实就是浮点INF。: 未捕获的 C++ 异常。
2025-10-28 10:06:04
1346
原创 Window/linux获得程序运行目录C++
本文介绍了获取程序运行路径的几种方法。Windows系统中可使用_pgmptr变量获取当前程序路径;getcwd()函数获取当前工作目录但不含文件名;Linux系统可通过readlink读取/proc/self/exe符号链接获取完整路径。C++17的filesystem库提供跨平台解决方案,Windows下也可直接使用GetModuleFileNameAPI。此外,argv[0]虽然能获取路径但不稳定。推荐Windows系统优先使用GetModuleFileName,Linux系统使用readlink。
2025-07-12 21:13:15
492
原创 动态规划基本操作
动态规划(Dynamic Programming)是一种通过将复杂问题分解为重叠子问题并存储子问题解来优化求解的方法。掌握动态规划需要理解"状态定义"和"状态转移"两个核心概念,通过练习经典问题培养解题直觉。:自顶向下递归+缓存。:使用位运算减少维度。
2025-07-12 20:12:31
818
原创 树状数组优化动态规划
本文介绍了树状数组优化动态规划的方法,从基础概念到实际应用。主要内容包括:1) 树状数组基础实现与特性回顾;2) 树状数组优化DP的原理与适用场景;3) 一维应用(如最长上升子序列)的优化实现与效果对比;4) 二维树状数组的实现及其在矩阵路径问题中的应用。通过树状数组可将部分DP问题的时间复杂度从O(n²)降至O(n log n),显著提升算法效率。文章提供了完整的C++实现代码,包括标准树状数组、最大值树状数组及其二维扩展版本。
2025-07-12 20:09:27
403
原创 数位动态规划详解
数位动态规划(Digit DP)是一种高效解决数字位相关计数问题的算法,尤其适用于统计大区间内满足特定条件的数字数量。本文系统介绍了数位DP的核心思想、状态设计和C++实现模板,包含20+经典问题解析。数位DP通过数字分解、状态压缩和记忆化搜索,在数字的每一位上进行状态转移,同时处理数字限制条件。文章详细讲解了通用模板框架、关键参数解析、四大核心函数,以及如何处理不含特定数字、数字和、数字乘积等问题。此外,还介绍了多状态压缩、模数状态、二进制状态等高级技巧,以及前导零和上下界的特殊处理方法。
2025-07-12 15:54:30
606
原创 树形动态规划详解
本文系统介绍了树形动态规划(Tree DP)的核心原理、经典模型和高级技巧,并提供了C++实现模板。主要内容包括:1)树形DP的基本概念和解题步骤;2)通用框架与状态设计模板;3)三大经典问题实现(最大独立集、最小点覆盖、最小支配集);4)进阶模型(树上背包、树直径、树重心);5)换根DP等高级技巧。通过20+经典问题解析,帮助读者掌握在树形结构上应用动态规划的方法,实现从基础到实战的进阶。
2025-07-12 15:14:32
859
原创 二维差分详解
学习路径掌握一维差分 → 2. 理解二维前缀和 → 3. 推导差分公式 → 4. 实现基础操作核心口诀“差分更新四步走,左上加k右下补,同行右侧需消减,同列下侧要消除”关键点:差分是离线算法,适用于"先批量更新,最后查询"的场景。对实时查询需求,需结合树状数组等数据结构。通过二维差分,我们以O(1)时间完成区域更新,用空间换时间的经典范例。理解其数学本质(容斥原理),即可灵活扩展到更高维度或变种问题。
2025-07-11 19:45:48
594
原创 状态压缩动态规划
使用整数的二进制位表示复杂状态棋盘覆盖问题(n ≤ 20)旅行商问题(TSP,n ≤ 16)集合划分问题排列组合问题// dp[i][s] 表示处理到第i行/第i个元素,状态为s时的最优解思维训练将实际问题抽象为状态集合设计简洁的状态表示方案寻找高效的状态转移方程调试技巧// 打印状态(二进制表示)i >= 0;i--)学习路径fill:#333;color:#333;color:#333;fill:none;掌握位运算理解状态压缩思想解决经典问题TSP。
2025-07-10 14:28:29
977
原创 区间动态规划详解
区间DP的核心状态定义为:dp[i][j]:表示序列/区间[i, j]上的最优解(或某种状态)通过枚举区间内的划分点k,将大区间[i, j]拆分成两个子区间[i, k]和[k+1, j]// 通常使用二维dp数组// dp[i][j] 表示区间[i, j]的答案破环成链:解决环形区间问题前缀和优化:快速计算区间和记忆化搜索:替代迭代DP(代码更简洁)k < j;++k)状态压缩:当区间长度较小时用位运算解题步骤识别区间特征定义DP状态推导转移方程处理边界条件。
2025-07-10 09:55:00
2295
原创 C++树状数组详解
由定义知:lowbit(j) > lowbit(i),因此区间[j - lowbit(j) + 1, j]包含[i - lowbit(i) + 1, i],故包含i。数学证明:对于任意正整数n,通过不断减去lowbit(n)最终会到达0,且步骤数不超过log₂n。经过的索引:I₁ = n, I₂ = n - lowbit(n), …递归上推,直到超过n,这些节点构成一条从i到根节点的路径,且只影响这些节点。:N头牛排成一列,已知每头牛前面比它编号小的牛的数量,求牛的排列顺序。b₁b₀,其中bₘ=1。
2025-07-09 21:30:30
1221
原创 C++十大排序详解(包括变种优化)
冒泡排序优化1. 提前终止优化(标志位优化)原理:在每一轮遍历中,若未发生任何元素交换,说明数组已有序,可直接终止排序,避免无效遍历。优点:对部分有序的数组效率显著提升(时间复杂度可降为O(n))。简单易实现,仅需增加一个标志位。2. 双向冒泡排序(鸡尾酒排序,Cocktail Shaker Sort)原理:在传统单方向冒泡的基础上,增加从右到左的逆向扫描,将较小的元素逐步移到左侧。每轮交替进行双向扫描,减少遍历次数。优点:适用于反向有序的数组(如完全降序),效率优于传统冒泡排
2025-07-08 15:45:50
1312
原创 线性动态规划(DP)与前缀和优化
通过前缀和优化,可以显著提升线性DP的效率,将原本的O(n²)复杂度降低到O(n)。在实际应用中,需根据具体问题设计合适的状态定义和前缀和数组,确保优化的有效性。
2025-07-08 05:30:00
1058
原创 Java红黑树Map
Java红黑树Map实现摘要: 红黑树是一种高效的自平衡二叉搜索树,通过颜色标记和旋转操作保证O(log n)的时间复杂度。Java实现包含节点类(RBTreeNode)和树类(RBTree),核心操作包括: 旋转操作(leftRotate/rightRotate)维持平衡 插入操作(insert)后调用fixInsert修复红黑性质 查找操作(find)利用二叉搜索树特性 删除操作(remove)后调用fixDelete修复性质 关键特性包括:根节点为黑色、红色节点不相邻、所有路径黑高相同。该实现通过哨兵
2025-07-07 19:21:52
410
原创 红黑树详解及C++实现
本文介绍了C++红黑树的实现及其高效操作。红黑树通过自平衡特性确保查找、插入和删除操作的时间复杂度为O(log n)。文章详细讲解了红黑树的五大规则、节点结构、旋转操作(左旋/右旋)以及插入流程。通过哨兵节点简化边界处理,插入操作后使用颜色调整和旋转维护平衡。代码实现展示了节点类、树结构、旋转逻辑和插入修复机制,为键值对存储提供了高效解决方案。
2025-07-07 18:57:04
661
原创 图论基础算法:DFS、BFS、并查集与拓扑排序的Java实现
DFS:深度优先遍历,提供递归和迭代两种实现BFS:广度优先遍历,使用队列实现层级遍历并查集:高效处理集合合并与查询,使用路径压缩和按秩合并优化拓扑排序:Kahn算法实现,自动检测环所有实现均遵循Java最佳实践,代码简洁高效。这些算法构成了图论的基础,掌握它们对于解决更复杂的图论问题至关重要。
2025-07-06 19:11:43
482
原创 图论基础:DFS、BFS、并查集与拓扑排序的C++实现
本文介绍了图论中四种基础算法的C++实现:DFS(深度优先搜索)、BFS(广度优先搜索)、并查集和拓扑排序。使用邻接表表示图,通过vector和list实现。DFS采用非递归栈实现(O(V+E)时间),BFS使用队列实现,适用于最短路径等场景。并查集采用路径压缩和按秩合并优化,用于连通性检测。拓扑排序对有向无环图进行线性排序,可用于任务调度。文末提供了完整测试示例,展示了各算法的实际应用和输出结果。这些算法是图论基础,广泛应用于社交网络、路径规划等领域。
2025-07-06 18:43:59
892
原创 字符串哈希Python
简洁性:利用Python的动态类型和简洁语法高效性:O(1)时间复杂度的子串比较灵活性:支持多种字符串操作场景安全性:双哈希技术减少冲突概率字符串快速匹配重复子串检测回文串处理字符串相似性比较通过合理选择基数和模数,并采用双哈希技术,可以在Python中构建出高效可靠的字符串处理工具。
2025-07-05 14:09:29
358
原创 Java字符串哈希
使用charAt()方法替代下标访问Java没有运算符重载,需要显式调用方法Java没有内置的Pair类,需要自行实现使用ArrayList和HashMap替代C++的vector和字符串快速匹配重复子串检测回文串处理字符串相似性比较通过合理选择基数和模数,并采用双哈希技术,可以在Java中构建出高效可靠的字符串处理工具。
2025-07-05 12:11:36
379
原创 C++字符串哈希
高效性:常数时间比较任意子串灵活性:支持多种字符串操作简单性:实现相对简单字符串快速匹配重复子串检测回文串处理字符串相似性比较通过合理选择基数和模数,并采用双哈希技术,可以构建出高效可靠的字符串处理工具。// 示例测试代码// 验证前缀哈希cout << "完整字符串哈希: " << sh.getHash(0, text.length()-1) << endl;// 比较相同子串cout << "相同子串 'abra': ""相等" : "不等") << endl;
2025-07-05 11:36:47
539
1
原创 Java内存保护
将你要加密的的数字进行加减乘除等运算(或位运算)进行加密,将123456变为123789(123456+333),使用时在变为123456(123789-333),可以互相解密。
2025-07-04 21:24:40
325
原创 贪心算法详解及Java实现
贪心算法是一种简单高效的算法设计范式,适用于具有贪心选择性质的问题。虽然它不能解决所有优化问题,但在适用场景下能提供高效的解决方案。理解贪心算法的原理和实现方式,对于解决实际编程问题具有重要意义。在Java中实现贪心算法时,可以利用Collections.sort()或Arrays.sort()进行排序,结合适当的比较器来制定贪心策略。通过练习经典贪心问题,可以更好地掌握这一算法思想。关键点总结贪心算法做出局部最优选择期望得到全局最优必须验证问题是否具有贪心选择性质。
2025-07-04 18:51:02
924
原创 贪心算法:简单而高效的求解策略C++
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的策略,从而希望导致全局最优解的算法思想。局部最优性:每一步只考虑眼前最佳选择不可回溯:选择后不再重新考虑高效性:通常时间复杂度较低⚠️ 注意:贪心算法不一定得到全局最优解,仅适用于具有贪心选择性质和最优子结构的问题。贪心算法以其高效性和简洁性成为解决优化问题的重要工具。验证问题是否满足贪心性质设计合理的贪心策略通过数学归纳法或反证法证明正确性重要提示:贪心算法的正确性证明比代码实现更重要!
2025-07-04 18:41:16
405
原创 C++内存保护
试想一下,你辛辛苦苦编出了一个游戏,结果被别人拿修改器直接通关了,气不气?本文教你一个保护内存的几个方法,防止被他人查找到或更改。
2025-07-02 20:18:49
794
原创 基于Windows GDI的轻量级绘图库封装
该封装库通过:分层命名空间组织代码简化GDI对象生命周期管理提供链式调用风格支持动态顶点收集将Windows GDI的复杂度降低了约40%,特别适合需要快速实现基础绘图功能的场景。读者可根据实际需求扩展更多图形类型和样式支持。完整代码实现细节请参考文首代码段,使用时需注意:在WM_PAINT消息外绘制时需使用GetDC/ReleaseDC高DPI环境需调整坐标转换建议在项目预编译头中定义WIN32_LEAN_AND_MEAN。
2025-03-23 11:00:01
485
原创 递归(DFS)
DFS是一种强大的图和树遍历算法,适用于许多实际问题,如迷宫求解、连通分量查找等。通过递归实现DFS,可以简洁而直观地解决这些问题。
2024-12-14 15:04:51
570
原创 第一本书总结
赋值表达式的类型为等号左边对象的类型,表达式的结果为等号左边对象被赋值后的值,运算的结合性为自右向左。除了“=”以外,C++还提供了10种复合的赋值运算符:+=,-=,*=,/=,%=,<<=,>>=,&=,“=,|=。扩展升级而产生,是一款编译型语言,面向对象程序设计,C++语言是对C语言的扩充,1979年,本贾尼·斯特劳斯特卢普开始从事将C改变的活动,1983年,该语言被正式命名为C++。只有当两个操作数的值都为false时,或运算的结果才为false,其它情况下或运算的结果均为true。
2024-04-27 13:20:44
1272
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅