动态规划(dynamic programming)(二、最优子问题与重叠子问题,以及与贪心的区别)

一、动态规划基础

  虽然我们在(一)中讨论过动态规划的装配线问题,但是究竟什么时候使用动态规划?那么我们就要清楚动态规划方法的最优化问题中的两个要素:最优子结构和重叠子问题。

  1、最优子结构

    1)如果问题的一个最优解包含了子问题的最优解,则该问题具有最优子结构。当一个问题具有最优子结构的时候,我们就可能要用到动态规划(贪心策略也是有可能适用的)。

    2)寻找最优子结构时,可以遵循一种共同的模式:

      a、问题的一个解可以是一个选择。例如,装配站选择问题。

      b、假设对一个给定的问题,已知的是一个可以导致最优解的选择。不必关心如何确定这个选择,假定他是已知的。

      c、在已知这个选择之后,要确定那些子问题会随之发生,以及如何最好的描述所的得到的子问题空间。

      d、利用一种“剪贴”技术,来证明在问题的一个最优解中,使用的子问题的解本身也必须是最优的。

    3)最优子结构在问题域中以两种方式变化:

      a、有多少个子问题被使用在原问题的一个最优解中,以及

      b、再决定一个最优解中使用那些子问题时有多少个选择

      在装配线调度问题中,一个最优解只使用了一个子问题,但是,为确定一个最优解,我们必须考虑两种选择。

    4)动态规划与贪心算法的区别

      动态规划以自底向上的方式来利用最优子结构。也就是说,首先找到子问题的最优解,解决的子问题,然后找到问题的一个最优解。寻找问题的一个最优解需要首先在子问题中做出选择,即选择用哪一个来求解问题。问题解的代价通常是子问题的代价加上选择本身带来的开销。

      在贪心算法中是以自顶向下的方式使用最优子结构。贪心算法会先做选怎,在当时看来是最优的选择,然后在求解一个结果子问题,而不是现寻找子问题的最优解,然后再做选择。

  2、重叠子问题

    适用于动态规划求解的最优化问题必须具有的第二个要素是子问题的空间要“很小”,也就是用来解原问题的递归算法可以反复的解同样的子问题,而不是总在产生新的子问题。典型的,不头痛的子问题数十输入规模的一个多项式,当一个递归算法不断的调用同一问题是,我们说该最优问题包含重叠子问题。

    动态规划算法总是充分利用重叠子问题,即通过每个子问题只解一次,吧解保存在一个需要时就可以查看的表中,而每一次查表得时间为常数。

原文地址:https://www.cnblogs.com/weiliuyby/p/8451507.html

时间: 2024-10-12 01:59:00

动态规划(dynamic programming)(二、最优子问题与重叠子问题,以及与贪心的区别)的相关文章

算法应用公式(二)动态规划 Dynamic Programming

动态规划在计算机中是一个比较玄学的算法,有的人可能看很久都很疑惑这到底是怎么回事,但是一旦理解了,上手就非常容易了. 算法描述 (以下内容来自百度百科)动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimali

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

优化问题 Optimization Problems & 动态规划 Dynamic Programming

2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题(亦译为受约束的最优化问题)是一类数学最优化问题,它由目标函数以及与目标函数中的变量相关的约束条件两部分组成,优化过程则为在约束条件下最优化(最大化或最小化)目标函数. 经典的优化问题: 最短路问题 旅行商问题(TSP) 装箱问题 调度问题 背包问题 了解并熟练掌握这些经典的优化问题会对以后遇到的新的

动态规划-Dynamic Programming(DP)

动态规划 动态规划方法心得 ? 动态规划是一般的面试.笔试中的高频算法题,熟练掌握必要的.动态规划的中心思想是在解决当前问题时,可以由之前已经计算所得的结果并结合现在的限制条件递推出结果.由于此前的计算结果已经保留下来,所以极大的缩短了时间复杂度. ? 解决动态规划问题的关键是找出状态表达式,即如何由之前的结果推导出现在的结果.另外,有的问题有很多限制条件增加问题的难度,需要剥丝抽茧,将问题解决.在找到状态表达式后,分为三步解决问题: 一. 定义内存空间,用来保存每步结果,并根据题目初始化,有些

2018.3.1-2 huffman code and dynamic programming

这周先是huffman code,这东西是一种对数据进行二进制编码的方式,这样子编码可以压缩空间,算是一种压缩算法.比如一串数据里只有a,b,c,d四个字节,一般可能会觉得就00,01,10,11来指代这四个了,然而这里可能a出现的概率超过60%,其余三个都是百分之十几,那么像0,10,110,111这种编码就更好一些.构造赫夫曼编码的方式算是一种贪心算法,实际上是一个构造二叉树的过程,实际就是先找出出现概率最低的两个点,把它们作为最底层的叶子,然后合并它们的概率,再把它们当做一个点与其他点比较

Dynamic programming:from novice to advanced【动态规划】

动态规划:从新手到专家 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的一些理解.水平有限,还望指摘.

笔试算法题(44):动态规划(Dynamic Programming)

议题:动态规划(Dynamic Programming) 分析: DP主要用于解决包含重叠子问题(Overlapping Subproblems)的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存最简单子问题的解,然后逐步合并成为原问题的解,由于需 要查询子问题的解,所以需要一个表格记录子问题的解:DP仅适用于最优子结构问题(Optimal Substructure),也就是局部最优解相当于(或者近似于)全局最优解: 对于原问题而言,当递归地自顶向下对问题进行求解时,每次产生的

动态规划算法(Dynamic Programming,简称 DP)

动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍的高级技巧部分看到相关内容,什么状态转移方程,重叠子问题,最优子结构等高大上的词汇也可能让你望而却步. 而且,当你去看用动态规划解决某个问题的代码时,你会觉得这样解决问题竟然如此巧妙,但却难以理解,你可能惊讶于人家是怎么想到这种解法的. 实际上,动态规划是一种常见的「算法设计技巧」,并没有什么高深莫测,至于各种高大上的术语,那是吓唬别人用的,只要你亲自体验几把,这些名词的含义其实

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K