IT技术博客大学习 共学习 共进步

标签:动态规划

共 8 篇相关文章

IT 累计浏览 5

GESP 202506 5级真题「奖品兑换」题解

这篇题解讲的是 GESP 2025 年 6 月五级的一道题目“奖品兑换”。题目要求用两种面值的兑换券兑换奖品,求能兑换的最大数量,数据规模高达 10^9,直接暴力枚举肯定超时,而想设计一个万无一失的贪心策略又很困难。 作者的核心解法是“二分答案+判定”。关键思路在于:兑换券数量越多,所需的另一种券就越多,满足单调性,因此可以对最大兑换数进行二分搜索。对于每一个待检验的答案 k,先按“全都用大面值券兑换”的方式计算,如果小面值券超额了,就逐步将部分兑换方案切换为使用小面值券,通过计算需要切换的次数(涉及向上取整)来判断是否在总券数内可行。 整道题综合考查了二分搜索、数学推导(包括向上取整的代码写法)以及对数据范围的敏感度。题目设计有区分度:没想到二分的同学用贪心或暴力也能拿到部分分数,而想出最优解则能全面锻炼算法思维。代码实现时还需要注意用 `long long` 防止溢出。

IT 累计浏览 4,325

建立动态规划状态转移方程的练习

这篇文章通过LeetCode上的八个经典题目,生动演示了如何攻克动态规划中最核心的一步:建立状态转移方程。作者从自身的复习笔记出发,挑选了Word Break、Unique Paths、Edit Distance等覆盖字符串、网格、树结构等多个领域的典型问题,逐一拆解其思考过程。 文章的核心观点是,解动态规划题的本质在于“状态识别”和“状态转移方程建立”这两步。像循环与递归的选择、空间换时间的优化,都只是实现技巧而非核心。例如,在解“三角形最小路径和”时,关键在于定义从底层向上积累的最短路径值f(i, k),并建立f(i, k) = min(下一层相邻状态) + 当前值的递推关系。对于“交错字符串”问题,则需定义f(i, j)表示两个子串前缀能否形成目标前缀,并据此建立逻辑或的转移方程。 作者没有停留在给出公式,而是试图还原每道题背后的状态定义逻辑。这种从具体例子提炼通用思考方法的叙述,让抽象的“建立方程”变得可触摸。对于正在学习动态规划的人来说,跟随这八个问题的思路走一遍,能有效训练如何从问题描述中提取状态,并找到状态之间递推关系的“感觉”。

IT 累计浏览 2,764

12个经典的行程问题

从小学奥数课堂到公务员考场,再到大厂笔试面试,总有些经典行程问题会不期而遇——它们往往背景简单、人人能懂,但解题的巧思却让人拍案叫绝。 这篇文章正是由一位技术人整理,汇集了12道这样的经典题目。这些题目大多久经流传,堪称“熟面孔”,但作者并非简单罗列,而是着重呈现了它们“简单有趣”且“颇具启发性”的一面。每道题都像一个精巧的思维体操,考验着读者在路程、速度与时间之间转换与权衡的能力。 作者分享的初衷很朴素:希望大家至少能从中发现一道自己未曾见过的题目,从而重温那种被奇巧思路“难住”后豁然开朗的乐趣。无论是用来锻炼逻辑、辅导孩子,还是作为技术面试前的热身,这些经过时间检验的智力题,本身就是在分享一种解决问题的思考过程与纯粹快乐。

IT 累计浏览 2,621

程序设计中的计算复用(Computational Reuse)

这篇讲的是计算复用——一个通过“记住结果”来避免重复劳动的编程思想。作者从斐波那契数列这个经典例子切入,直观对比了三种计算方式:朴素递归的指数级时间复杂度,记忆化(Memoization)的显著提速,以及动态规划(Dynamic Programming)的自底向上最优解。 文章的核心并非仅仅讲解算法,而是以它为透镜,阐释“计算复用”这一更通用的模式。它清晰地指出,在计算资源有限的现实世界中,单纯追求代码的优雅或直观是不够的,我们必须有意识地在“用空间换时间”和“设计更优的计算路径”之间做出权衡。这种思想不仅适用于算法竞赛,更是优化任何有大量重复计算场景(如前端渲染、数据库查询)的关键。 最后,文章将计算复用与“抽象”和“设计模式”进行了有启发的类比。它告诉我们,优秀的程序员不仅是在写代码,更是在设计一个高效、可复用的“计算过程”。这种从具体代码上升到通用思想的视角,能帮助我们在面对复杂系统时,更主动地去寻找和设计其中的复用机会。

IT 累计浏览 3,621

写在 0x20 岁之前

这篇讲的是一位年轻技术人在即将迈入“0x20”(即32岁)之际,对技术成长路径、社区参与和个人发展的一次真诚复盘与展望。作者的核心观点是,技术人的影响力不应局限于使用技术,更在于如何“反哺”技术生态。 文章从个人经历出发,提出了从技术“消费者”转变为“贡献者”的关键一步。这并不要求多么宏大的目标,而是始于具体行动:为常用开源项目提交一次代码补丁、参与一次社区讨论、甚至只是完善一次文档。作者以自身参与 Rust 和 Zig 等语言社区为例,分享了如何从“旁观者”真正融入一个小圈子,并在其中找到归属感与驱动力。 更深层的启发在于,这种“输出”不仅滋养社区,也反过来锤炼自身的思维与工程能力。作者指出,持续、公开的技术实践与分享,是构建个人技术品牌最扎实的路径。对于许多有心参与却不知从何开始的开发者而言,这篇文章没有提供高深方法论,而是描绘了一条从身边小事做起、自然融入社区的可行路径,这些朴素的行动指南或许正是最实用的“成人礼”。

IT 累计浏览 4,460

Levenshtein distance相似度算法

这篇讲的是 Levenshtein 距离——一个在文本处理、搜索纠错等领域非常有用的相似度算法。它由俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出,通过计算将一个字符串转换成另一个所需的最少编辑操作次数(插入、删除、替换)来衡量差异。 与简单的精确匹配或汉明距离相比,它能更好地处理现实中的拼写错误或格式变体,比如在拼写检查、DNA 序列比对、甚至推荐系统的模糊匹配中都扮演着关键角色。文章从算法背景切入,清晰地阐释了其核心思想与应用价值,让读者快速理解这一基础工具的工作原理和适用场景。

IT 累计浏览 4,063

求职面试时常被问到的65个问题与技巧性回答

这篇整理了65个技术岗位求职面试中的高频问题,并提供了相应的技巧性回答建议。文章从“请你自我介绍一下你自己”这类基础问题入手,覆盖了个人经历、技术能力、项目经验、团队协作、职业规划等多个维度,几乎囊括了面试官可能抛出的所有考察点。 它的价值不仅在于罗列问题,更在于为每个问题拆解了回答思路。例如,针对自我介绍,它提示要突出与岗位匹配的核心技能和项目成果;而对于情景类或行为类问题,则引导候选人使用STAR法则(情境、任务、行动、结果)来组织答案,让叙述结构清晰、重点突出。这些方法能帮助求职者跳出简单“背答案”的陷阱,转而展示出自己的逻辑思考与解决问题能力。 无论你是准备第一场面试的应届生,还是计划跳槽的资深工程师,这份清单都像一份详细的“面试地图”,帮你系统性地查漏补缺,把可能遇到的提问场景提前演练一遍。

IT 累计浏览 3,240

思维盲点

这篇以明朝朱棣靖难之役为切入点,揭示了一个深刻的思维盲点:当目标看似触手可及时,人们容易被眼前最显眼的障碍完全吸引,从而忽视更全局的可能性。 文章聚焦于朱棣在北平起兵、距离夺取南京只差一步时的关键决策困境。他得知南京守备空虚,本可挥师南下直取胜利,但通往南京的必经之路上,山东一带民风彪悍、守将精良,成为一道看似无法逾越的屏障。朱棣的思维被“必须正面攻克山东”这个单一假设锁死,陷入了与强敌硬碰硬的惯性陷阱,而没能跳出来思考是否有绕过这个难点、达成最终目标的其他路径。 这个历史故事对技术人同样有强烈的映照。在系统设计、架构决策或故障排查时,我们是否也常常被某个看似关键的技术难点(比如一个难优化的算法、一个难集成的接口)所牵制,而忘记了最初要解决的核心问题,错过了更简洁、更创新的解法?文章提醒我们,真正的突破有时不在于攻克眼前的每一块硬骨头,而在于重新审视目标本身,敢于跳出给定的“战场”定义。