动态规划算法详解与应用

需积分: 10 12 下载量 167 浏览量 更新于2024-08-01 收藏 611KB PPT 举报
“动态规划算法课件PPT,清华老师的教学资料,讲解动态规划算法的原理和应用。” 动态规划是一种高效的问题解决方法,尤其适用于处理具有重叠子问题和最优子结构的问题。该算法的核心思想是通过存储和重用先前解决的子问题的解决方案,避免了不必要的重复计算,从而提高了效率。在描述中,我们可以看到动态规划与分治法有相似之处,都是将大问题分解为小问题来解决,但动态规划更注重于解决子问题间的依赖关系,而非独立求解。 算法总体思想: 动态规划的基本思路是将复杂问题分解为一系列子问题,这些子问题可能不是互不相干的,而是存在一定的关联。例如,在分治法中,通常子问题是相互独立的,而动态规划中的子问题会相互影响,导致在解决问题的过程中可能会多次重复计算相同的子问题。为了克服这个问题,动态规划采取“记忆化”策略,即在第一次解决某个子问题时,将其结果存储起来,当需要再次计算同一子问题时,直接调用已存储的结果,而不是重新计算,这样就大大减少了计算量。 动态规划基本步骤: 1. **最优解的性质刻画**:首先需要理解问题的最优解具备什么样的特性,这有助于构建解决问题的模型。 2. **递归定义最优值**:定义一个递归函数,该函数用于表示子问题的最优解。 3. **自底向上的计算**:从最简单的子问题开始,逐步解决更大的子问题,直到最终解决原问题。这个过程通常涉及到一个表格填充,称为“状态转移矩阵”或“动态规划表”。 4. **构造最优解**:通过填充状态转移矩阵的过程,我们不仅可以得到最优解的值,还可以恢复出最优解的具体形态。 以完全加括号的矩阵连乘积为例,这是一个经典的动态规划问题。完全加括号意味着每个矩阵乘法都有相应的括号,使得计算顺序明确。动态规划可以找到使矩阵乘法运算顺序最优的括号方案,使得总的运算次数最少。通过构建一个二维数组,其中每个元素表示对应大小的矩阵连乘积的最小运算次数,然后自底向上地填充数组,最终得到整个矩阵连乘积的最优解。 动态规划是一种强大的工具,广泛应用于计算机科学和工程领域,如图论、组合优化、字符串匹配、网络流问题等。掌握动态规划算法不仅可以提高问题解决能力,还能在实际项目中实现高效的解决方案。
2008-09-30 上传
动态规划 目录 概念引入 例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