从暴力递归到动态规划,记忆化搜索

爱敲代码的Harrison 2021-12-28 20:17:21
...全文
87 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文深入讲解了CSP-S竞赛中从暴力搜索到记忆化搜索的优化路径,重点阐述记忆化搜索的核心思想、技术优势及其在实际算法题中的应用。文章通过定义关键概念、列举核心技巧(如哈希缓存、状态压缩、迭代加深、对拍脚本),并结合典型场景(棋盘博弈、括号序列、树形背包)展示其高效性。以《括号王国》为例,详细剖析了状态设计、转移方程、边界处理及代码实现全过程,强调记忆化搜索在将指数级复杂度降为多项式级方面的巨大作用,并提供调试技巧与性能分析。同时展望了自动记忆化、GPU加速、AI融合及量子计算等未来趋势。; 适合人群:有一定算法基础、准备参加CSP-S或信息学奥赛提高组的中高级选手,具备基本递归动态规划理解能力的学生或编程爱好者。; 使用场景及目标:①掌握如何将暴力DFS优化为记忆化搜索以应对TLE问题;②学习在括号序列、树形DP等复杂场景下设计有效状态与转移逻辑;③通过实战案例提升竞赛中高效编码与调试能力,争取满分通过。; 阅读建议:建议结合代码实例动手实现并进行对拍测试,重点关注状态定义的合理性与剪枝技巧,在理解递归结构的基础上体会其与传统DP的异同,同时关注文中提到的前沿发展方向以拓展视野。
动态规划 目录 概念引入 例1:最短路问题 最优化原理 根据最优化原理求解最短路问题 动态规划适应于解决什么样的问题 例2:背包问题 例3:马尔可夫过程问题 例4:迷宫镜子问题 例5:防卫导弹问题 例6:剩余糖果问题 动态规划的基本概念 动态规划的基本思想 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 动态规划的适用条件 1.最优化原理 若由点A到点E的最短路线过某点P,则在这条路线上P到E的距离是P、E两点间各条路线中的最短距离。最优化原理也可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。 2.无后效性 所谓无后效性是指:过去的决策只能通过当前的状态影响未来的发展,当前的状态是以往状态的总结。也可这样阐述:在状态转移过程中,一旦到达某阶段某一状态,则以后过程的发展仅与这一状态有关,而与此状态之前的决策无关。 动态规划法所针对的问题有一个显著的特征 即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。 动态规划的逆向思维法是指从问题目标状态出发倒退回初始状态或边界状态的思维方式,其要点可归纳为以下三个步骤:(1)分析最优值的结构,刻画其结构特征;(2)递归的定义最优值;(3)按自底向上或自顶向下记忆化的方式计算最优值。 例7:计算矩阵连乘积 问题描述 在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。其标准计算公式为: 最长公共子序列问题LCS 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,…,k有 最长公共子序列问题LCS 最长公共子序列(LCS)问题:给定两个序列X=和Y=,要求找出X和Y的一个最长公共子序列 动态规划算法可有效地解此问题。下面我们按照动态规划算法设计的各个步骤来设计一个解此问题的有效算法。 1.最长公共子序列的结构 解最长公共子序列问题时最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是否为X和Y的公共子序列,并且在检查过程中选出最长的公共子序列。X的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列{1, 2, …, m}的一个子序列,因此,X共有2m个不同子序列,从而穷举搜索法需要指数时间。 事实上,最长公共子序列问题也有最优子结构性质,因为我们有如下定理: 定理: LCS的最优子结构性质 设序列X=和Y=的一个最长公共子序列Z=,则: 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列; 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列; 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。 其中Xm-1=,Yn-1=,Zk-1=。 2.子问题的递归结构 由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。 由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最长公共子序列。 (1)初始化操作,c[i,0]=0,i=1,2,…,m;c[0,j]=0,j=1,2

96

社区成员

发帖
与我相关
我的任务
社区管理员
  • c_university_1603
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧