贪心算法和动态规划算法

动态规划和贪心算法都是一种递推算法 即均由局部最优解来推导全局最优解 (不从整体最优解出发来考虑,总是做出在当前看来最好的选择。)

不同点:

贪心算法

与动态规划的区别:贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留。

能使用贪心法求解的条件:是否能找出一个贪心标准。我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角、五分和一分,求最小找币数时,可以用贪心法求解;如果将这三种币值改为一角一分、五分和一分,就不能使用贪心法求解。

例:贪心法标准的选择

设有n个正整数,将它们连接成一排,组成一个最大的多位整数。

例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。

又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。

输入:n个数

输出:连成的多位数

算法分析:此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。按这种标 准,我们很容易找到反例:12,121应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如12,123就是 12312而非12123,这种情况就有很多种了。是不是此题不能用贪心法呢?其实此题可以用贪心法来求解,只是刚才的标准不对,正确的标准是:先把整数转换成字符串,然后在比较a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反之则把a排在b的后面。

动态规划算法

与贪心法的区别:不是由上一步的最优解直接推导下一步的最优解,所以需要记录上一步的所有解 (下例中的F[i][j]就表示第i行的j个解)

能使用动态规划算法的条件:

如果一个问题被划分各个阶段之后,阶段I中的状态只能由阶段I-1中的状态通过状态转移方程得来,与其它状态没有关系,特别是与未发生的状态没有关系,那么这个问题就是“无后效性”的,可以用动态规划算法求解

动态规划算法求解:

1。定义阶段:第i行第j列的值a[i][j]

2。定义状态:走到第i行第j列的最大值F[i][j]

3。状态转移方程:F[i][j] = a[i][j]+max(F[i+1][j], F[i+1][j+1])

4。定义边界条件:当i = n时,F[i][j] = a[i][j]; 即一开始可以直接得出的局部最优解

时间: 2024-11-08 09:19:51

贪心算法和动态规划算法的相关文章

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

贪心算法,递归算法,动态规划算法比较与总结

一般实际生活中我们遇到的算法分为四类: 一>判定性问题        二>最优化问题        三>构造性问题        四>计算性问题 而今天所要总结的算法就是着重解决  最优化问题 <算法之道>对三种算法进行了归纳总结,如下表所示:   标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要

动态规划算法的理解

什么是动态规划算法? 动态规划算法其实质就是分治思想和解决冗余.因此它与分治法和贪心法类似,都是将待求解问题分解为更小的,相同的子问题,然后对子问题进行求解,最终产生一个整体最优解. 适合采用动态规划法求解的问题,经分解得到的各个子问题往往不是相互独立的.在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松地找出. 示例如下: Fibonacci数列       0   n=0 f(n)=  1   n=1 f(n-1)+f(n-2)    n>1 如果n=4,则f(4)=f(3)+f(

五种常用算法之二:动态规划算法

动态规划算法: 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的.若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次.如果我们能够保存已解决的子问题的答案,而在需要时再找

动态规划算法(转载)

动态规划算法 例题1: https://segmentfault.com/a/1190000008244955 例题2: https://segmentfault.com/a/1190000007927865 讲解: http://www.hawstein.com/posts/dp-novice-to-advanced.html 顶级讲解动态规划:http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html(本文转载自此文) 下面是原文:

五大经典算法之动态规划

一.概念起源 ??动态规划,又名DP算法(取自其Dynamic Programming的缩写),最初是运筹学的一个分支,是用来求解决策过程最优化的数学方法. 二.基本思想 ??把 多阶段过程 转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解.那什么叫多阶段过程呢? 多阶段过程:首先大家可以思考一下以下这个问题: 假如我们有面值为1元/3元/5元的硬币若干枚,如何用最少的硬币凑够137元? 当然我们可以使用暴力枚举解决这个问题,不够那样复杂度就太高了.我们可以这样考虑,凑齐137元可以看成一

五大常用算法----贪心、动态规划、分支限界、分治算法和回溯算法

五大常用算法之一:贪心算法 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 五大常用算法之二:动态规划算法 五大常用算法之三:分支限界算法

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[