贪心导论
- 格式:pdf
- 大小:217.51 KB
- 文档页数:9
贪心算法流程图贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法,以期望能够获得全局最优解。
在实际应用中,贪心算法通常用来解决最优化问题,比如最小生成树、哈夫曼编码等。
贪心算法的流程图可以帮助我们更直观地理解其工作原理和实现过程。
首先,我们来看一下贪心算法的流程图。
在图中,首先我们需要确定问题的解空间,然后根据问题的特点选择合适的贪心策略。
接着,我们需要确定每一步的最优选择,并且不断更新当前状态,直到达到最优解或者无法继续优化为止。
在实际应用中,贪心算法的流程图可以根据具体问题的特点进行调整和优化。
下面我们以一个简单的例子来说明贪心算法的流程图。
假设现在有一组活动,每个活动都有一个开始时间和结束时间,我们希望安排尽可能多的活动,使得它们之间不会相互冲突。
这个问题可以用贪心算法来解决。
首先,我们需要对活动按照结束时间进行排序,然后从第一个活动开始,依次检查每个活动的开始时间是否晚于上一个活动的结束时间。
如果是,则将该活动加入最优解集合中,并更新当前状态。
如果不是,则将该活动舍弃。
通过这样的贪心策略,我们可以得到安排最多活动的最优解。
整个流程可以用一个简单的流程图来表示,从而更直观地理解贪心算法的工作原理。
贪心算法的流程图不仅可以帮助我们理解算法的实现过程,还可以指导我们在实际应用中进行调整和优化。
通过对问题解空间的划分和贪心策略的选择,我们可以更快地找到最优解,提高算法的效率和性能。
总之,贪心算法的流程图是我们理解和应用贪心算法的重要工具,它可以帮助我们更直观地理解算法的工作原理,指导我们进行问题求解和算法优化。
希望通过本文的介绍,读者能对贪心算法有一个更深入的理解,并在实际应用中取得更好的效果。
列举用贪心算法求解的经典问题贪心算法是一种简单而高效的问题求解方法,通常用于求解最优化问题。
它通过每一步选择当前状态下的最优解,最终得到全局最优解。
贪心算法的核心思想是:每一步都做出一个局部最优的选择,并认为这个选择一定可以达到全局最优。
以下是一些经典问题,可以用贪心算法求解:1. 零钱兑换问题(Coin Change Problem):给定一些不同面额的硬币和一个目标金额,找到最少的硬币数量,使得硬币总额等于目标金额。
贪心算法可以按照硬币的面额从大到小进行选择,每次选择尽量大面额的硬币。
2. 区间调度问题(Interval Scheduling Problem):给定一些区间,找到最多的不相交区间。
贪心算法可以按照区间的结束时间进行排序,每次选择结束时间最早的区间,确保选择的区间不重叠。
3. 分糖果问题(Candy Problem):给定一个数组表示每个孩子的评分,要求给这些孩子分糖果,满足以下要求:每个孩子至少分到一个糖果,评分高的孩子要比相邻孩子分到的糖果多。
贪心算法可以从左到右进行两次遍历,分别处理评分递增和评分递减的情况。
4. 跳跃游戏问题(Jump Game Problem):给定一个非负整数数组,表示每个位置的最大跳跃长度,判断是否能从第一个位置跳到最后一个位置。
贪心算法可以记录当前能够到达的最远位置,并且更新为更远的位置。
5. 任务调度器问题(Task Scheduler Problem):给定一串任务,每个任务需要一定的冷却时间,要求以最短的时间完成所有任务。
贪心算法可以按照出现次数进行排序,优先执行出现次数最多的任务,并在冷却时间内执行其他任务。
6. 区间覆盖问题(Interval Covering Problem):给定一些区间,找到最少的区间数,使得它们的并集覆盖了所有输入区间。
贪心算法可以根据区间的起始位置进行排序,每次选择最早结束的区间,并将它添加到最终结果中。
以上仅是一些经典问题的例子,实际上还有很多问题可以用贪心算法来求解。
贪心算法知识点总结1. 基本原理贪心算法的基本原理是每一步都选择当前状态下的最优解,以期望最终得到全局最优解。
具体来说,贪心算法通常可以分为以下几个步骤:1)从问题的某个初始解出发2)采用一种迭代的方式,逐步将初始解进行优化3)每一步都是基于当前状态的最优选择来进行优化4)直到无法再进行优化,得到问题的最优解由于贪心算法每一步都要选择局部最优解,因此贪心算法通常具有高效性。
然而,贪心算法并不适用于所有问题,其结果不一定是全局最优解。
因此,在使用贪心算法时需要注意问题的特性和约束条件,以免得到错误的结果。
2. 适用情况贪心算法通常适用于满足以下条件的问题:1)问题的最优解满足“最优子结构”性质:即问题的最优解包含了其子问题的最优解2)问题的求解过程具有“贪心选择性”:即每一步都选择当前状态下的最优解,并不需要考虑未来的后果3)问题的约束条件可以通过局部最优选择满足全局最优解:即问题的解空间中存在一些局部最优解,可以通过一系列的局部最优解构建全局最优解在实际应用中,贪心算法通常用于求解最优化问题,如最小生成树、最短路径、任务调度等问题。
由于贪心算法的高效性,它通常能够在较短的时间内得到较为接近最优解的结果。
然而,贪心算法并不适用于所有问题,对于一些问题,贪心算法将得到错误的结果。
因此,在使用贪心算法时需要谨慎选择问题类型和约束条件,以避免错误的结果。
3. 贪心算法实例在下面的部分,我们将介绍一些常见的贪心算法实例,包括背包问题、活动安排问题、霍夫曼编码等。
3.1 背包问题背包问题是一个经典的优化问题,它包括0-1背包问题、分数背包问题等多种类型。
在0-1背包问题中,给定n种物品和一个容量为C的背包,每种物品i的重量为w[i],价值为v[i],求在不超过背包容量的情况下,如何选择物品放入背包,可以使得背包中的总价值最大。
对于0-1背包问题,贪心算法通常不能得到最优解。
然而,在分数背包问题中,贪心算法通常可以得到近似的最优解。
贪心算法的理解-概述说明以及解释1.引言1.1 概述概述部分的内容可以描述贪心算法的基本概念和作用。
贪心算法是一种常用的求解优化问题的算法思想,其核心思想是在每一步都选择当前最优解,从而希望最终达到全局最优解。
贪心算法通常适用于那些具有最优子结构特性和贪心选择性质的问题。
具体来说,贪心算法通常分为以下几个步骤:首先,根据问题的特性确定问题的目标函数或者判断问题的可行解的标准;其次,把原问题分解为若干个子问题,每次选择最优解作为当前问题的解;接着,对所选取的解进行判断,如果满足问题的约束条件,则放入解集中,否则舍弃;最后,递归或者迭代地处理下一个子问题,直到找出全局最优解。
贪心算法的应用非常广泛,它可以用来解决许多实际问题,比如最小生成树、最短路径、背包问题等。
贪心算法的优点在于简单、高效,其时间复杂度通常较低。
然而,贪心算法也有其局限性,它只关注当前的最优解而不考虑全局的最优解,因此在某些问题上可能会得到次优解甚至是错误的解。
综上所述,贪心算法是一种重要的优化算法思想,通过不断选择当前最优解来求解问题。
它的应用广泛,具有高效简单的特点,但也存在局限性。
在今后的发展中,我们可以对贪心算法进行改进,使其在更多的问题中发挥更强大的作用。
1.2 文章结构文章结构部分:本文分为引言、正文和结论三个部分。
引言部分主要概述了本文的主题——贪心算法,并介绍了文章的结构和目的。
正文部分将重点讲解贪心算法的定义、原理、应用场景以及优缺点。
首先,在2.1节中,我们将介绍什么是贪心算法。
贪心算法是一种在每一步选择中都选择当前情况下最好或最优的选择,以期望能够导致全局最优解的算法。
其次,在2.2节中,我们将详细解析贪心算法的原理。
贪心算法的核心思想是通过不断地做出局部最优选择,从而最终得到全局最优解。
我们将使用一些具体的示例来说明贪心算法的运作方式。
然后,在2.3节中,我们将探讨贪心算法的应用场景。
贪心算法在很多实际问题中都有广泛的应用,如任务调度、背包问题、最短路径等。
贪心算法的基本思路
以下是贪心算法的基本思路:
1. 定义问题:明确要解决的问题和可用的操作。
2. 选择最优解:在每一步中,选择当前看起来最优的解决方案。
这个选择通常基于问题的局部信息和贪心准则。
3. 局部最优:根据贪心准则做出的选择应该在当前步骤是最优的,即能够获得最大或最小的效益。
4. 构建解决方案:通过一系列的局部最优选择,逐步构建出整个问题的解决方案。
5. 检查可行性:在每一步之后,检查所做出的选择是否满足问题的约束条件和限制。
6. 重复步骤:重复上述步骤,直到达到问题的终止条件或无法进一步做出改进。
贪心算法通常在每一步都做出局部最优选择,希望通过一系列局部最优选择来达到全局最优解。
然而,贪心算法并不保证一定能得到全局最优解,尤其是在复杂的问题中。
贪心算法的优势在于其简单性和效率。
它通常在每一步只需要考虑少量的因素,因此计算复杂度较低。
贪心算法在一些情况下可以提供较好的近似解,并且在实际应用中经常被使用。
需要注意的是,贪心算法的正确性和有效性取决于问题的特性和贪心准则的选择。
在使用贪心算法时,需要仔细分析问题,选择合适的贪心准则,并通过实例验证算法的正确性。
算法导论——贪心算法求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。
对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的算法。
贪心算法(greedy algorithm)就是这样的算法,它在每一步都做出当时看起来最佳的选择。
也就是说,它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。
本章介绍一些贪心算法能找到最优解的最优化问题。
贪心算法并不保证得到最优解,但对很多问题确实可以求得最优解。
我们首先在16.1节介绍一个简单但非平凡的问题—活动选择问题,这是一个可以用贪心算法求得最优解的问题。
首先考虑用动态规划方法解决这个问题,然后证明一直做出贪心选择就可以得到最优解,从而得到一个贪心算法。
16. 2节会回顾贪心方法的基本要素,并给出一个直接的方法,可用来证明贪心算法的正确性。
16. 3节提出贪心技术的一个重要应用:设计数据压缩编码(Huffman编码)。
在16. 4节中,我们讨论一种称为“拟阵"(matroid)的组合结构的理论基础,贪心算法总是能获得这种结构的最优解。
最后,16. 5节将拟阵应用于单位时间任务调度问题,每个任务均有截止时间和超时惩罚。
贪心方法是一种强有力的算法设计方法,可以很好地解决很多问题。
在后面的章节中,我们会提出很多利用贪心策略设计的算法,包括最小生成树(minimum-spanning-tree)算法(第23章)、单源最短路径的djikstra算法(第24章),以及集合覆盖问题的Chvatal贪心启发式算法(第35章)。
最小生成树算法提供了一个经典的贪心方法的例子。
16.1 贪心选择假如我们无需求解所有子问题就可以选择出一个活动加人到最优解,将会怎样?这将使我们省去递归式(16. 2)中固有的考查所有选择的过程。
实际上,对于活动选择问题,我们只需考虑一个选择:贪心选择。
对于活动选择问题,什么是贪心选择?直观上,我们应该选择这样一个活动,选出它后剩下的资源应能被尽量多的其他任务所用。
列举用贪心算法求解的经典问题贪心算法是一种基于贪心策略的算法,它在每一步选择中采取最优的选择,从而达到全局最优的结果。
贪心算法通常求解的是最优化问题,例如最小生成树、最短路经、任务分配等问题,但并不是所有的最优化问题都可以用贪心算法解决,需要根据实际问题进行分析。
下面列举几个经典问题及其贪心算法的解法:1. 钞票找零问题这是一个典型的贪心算法问题,即如何用最少的钞票找零。
贪心算法的思路是,在每一步中选择面值最大的钞票,直到找完为止。
参考资料:- 《算法导论》第16章- 《算法竞赛入门经典》第2章2. 活动选择问题给定n个活动的起止时间,要求安排这些活动,使得尽可能多的活动能够不冲突地进行。
贪心算法的思路是,在每一次选择中选择结束时间最早的活动,因为这样可以给后面的活动留更多的时间。
参考资料:- 《算法竞赛入门经典》第3章- 《算法导论》第16章3. 背包问题将若干个物品放入一个容量为W的背包中,每个物品有自己的重量和价值。
要求在不超过容量的情况下,选择一些物品放入背包中,使得总价值最大。
贪心算法的思路是,选择价值比重量大的物品放入背包中,这样可以使得总价值最大。
参考资料:- 《算法竞赛入门经典》第4章- 《算法导论》第16章4. 最小生成树问题给定一个无向连通图,要求找到一棵生成树,使得边的权值和最小。
贪心算法的思路是,每次选择权值最小的边,加入生成树中,直到生成树包含了所有的节点。
参考资料:- 《算法竞赛入门经典》第7章- 《算法导论》第23章5. 最短路径问题给定一个有向图,求出一个节点到另一个节点的最短路径。
贪心算法的思路是,每次选择最短的路径,从起始节点开始,依次加入路径中的节点,直到到达目标节点。
参考资料:- 《算法竞赛入门经典》第8章- 《算法导论》第24章以上就是贪心算法常用的几个经典问题及其解法。
需要注意的是,贪心算法并不是对所有最优化问题都适用,需要根据具体情况进行分析和判断。
贪心算法子问题结构
贪心算法的思想是每一步都选择当前最优解,从而达到全局最优解。
而贪心算法子问题结构是指在求解问题的过程中,可以将原问题分解为几个子问题,并且每个子问题都可以使用贪心算法来解决。
这样,通过解决子问题,可以逐步推导出整个问题的解。
在使用贪心算法解决问题时,通常需要满足以下两个条件:1. 最优子结构:问题的最优解包含了子问题的最优解。
也就是说,通过求解子问题的最优解,可以得到整个问题的最优解。
2. 贪心选择性质:每一步都选择当下最优解,不考虑其他步骤的选择是否会对当前步骤的选择产生影响。
在解决贪心算法子问题时,常见的做法是:
1. 将原问题转化为子问题。
可以通过适当的方式将原问题转化为更小规模的子问题。
例如,可以通过剪枝或者条件限制来减少解空间。
2. 根据贪心选择性质选择最优解。
在每一步中,选择当前最优解,并且将问题规模进一步缩小。
3. 递归求解子问题。
通过递归求解子问题,获得整个问题的最优解。
需要注意的是,贪心算法并不适用于所有问题,且不一定能够找到全局最优解。
因此,在使用贪心算法求解问题时,需要先验证问题是否满足最优子结构和贪心选择性质,以及贪心算法是否能够得到问题的最优解。
贪心算法是一种常用的优化算法,它通过在每一步选择当前状态下的最优解来逐步求解问题。
下面是贪心算法的基本框架:
1.确定问题的最优子结构:
•首先,要确保问题具有最优子结构属性,即问题的最优解可以由子问题的最优解构成。
2.定义贪心策略:
•根据问题的特性,确定贪心策略,即在每一步选择中采取的决策规则。
贪心策略应该是局部最优的,并且希望通过局部最优解来达到
全局最优解。
3.构建解决方案:
•通过贪心策略,在每一步选择中确定当前的最优解。
•逐步构建解决方案,直到得到最终的全局最优解。
4.证明贪心选择的正确性:
•为了保证贪心算法的正确性,需要进行正确性证明。
证明贪心选择的每一步都不会破坏最优解的性质,从而保证最终得到的解是全局
最优解。
需要注意的是,贪心算法并不适用于所有问题,因为贪心策略可能会导致得到次优解或根本无法得到最优解。
在使用贪心算法时,需要仔细分析问题的特性,确保问题满足贪心算法的要求,并进行正确性分析。
总之,贪心算法的基本思想是通过每一步的局部最优选择来达到全局最优解。
在实际应用中,可以根据具体问题的特点设计相应的贪心策略。
贪心导论By Envelope2目录1.什么是贪心 (2)2.贪心的实际应用 (3)3.常用贪心方法(策略) (4)4.贪心技巧 (8)1.什么是贪心在算法与思想不断多样化的OI世界里,有一样东西。
它既是一种思想,一种普及大众、简单快捷的思想;又是一种算法,一种几乎无所不能、高效率、经济实用的算法。
它是OI新手们忠实崇拜的偶像,又是OI大牛们理想的最高境界。
没错,这个东西,就是————贪心。
常言道:“贪得无厌。
”然而,面临多元化的OI,我们不得不选择贪心。
为什么?因为贪心是紧随时代潮流的。
曾经有一位OI贪心大牛说过,“给我一道题,我就能贪心”,这就是最高境界。
有人会问:“贪心究竟是什么?”我无法准确回答,因为没有标准答案。
在每个人心目中,贪心的定义是不同的。
思想不同,算法也不同;但有一个共同目的————将思想简单化。
曾经有位大牛写过一篇《骗分导论》,我很喜欢。
在我看来,贪心就是一种高水平的骗分技术。
“有技术,一等奖也贪得来”,这就是我的信仰。
还有人说:“贪心很困难。
”正因如此,今天,我写下这篇《贪心导论》,以此与各位OIer们共享经验教训,也当作是考前的娱乐消遣。
2.贪心的实际应用今天,OI崇尚的是动态规划、搜索相结合。
然而,我却要在这里说贪心,原因何在?在于贪心的广泛性。
首先不得不说明的是,本人的贪心技术还不够到位,因此,本人对贪心的定义就是:尽可能地多拿分,而非以AC为目标。
举几个简单例子来说明一下。
[例1]有N个人排队接水。
每个人接水所用的时间不同,而一个时刻只能有一个人接水,且只有等一个人接完水后,另一个人才能开始接水。
现在请你求出N个人接水的顺序,使得每个人所用平均时间最短,并输出这个最短平均时间。
这道题是贪心的经典例题了。
当初此题发布时,有人想当然地认为是动态规划去求解。
虽然此题用动规也能解决,但是有没有更简单的方法呢?——当然有,就是贪心。
联系一下生活实际:排队的时候,如果出现拥挤情况,怎样做才能节约时间呢?让耗费时间最短的人先来,还是让耗费时间最长的人排第一?这样一想,问题就变得简单了,贪心策略也出来了————让耗费时间短的人排在前面。
于是一个快排,轻松解决。
看看这效率,那叫一个高啊~~~~~~~~~~~[例2]经典背包问题。
一个体积为V的包,现在有N个物品,每个物品都有一个体积和一个价值。
现在让你求出一个最佳方法,使得放进背包里的物品的价值尽可能大(当然放进去的物品总体积不会大于背包体积)。
这个问题我想就不用我废话了吧?也是经典的贪心问题,一种较优的策略为:将性价比高的物品尽可能多地往里放。
虽然由于数据不会太弱而难以AC,但分肯定是多拿定了。
而且,通过贪心,有效节约了时间,用以分配到其他难题上,可谓两全其美。
从以上例子中可以看出贪心在OI实际中的广泛应用了。
总之一句话:贪心才是王道!掌握贪心,与掌握动规同样重要!3.常用贪心方法(策略)接下来就是本人的自主品牌了~~~~~经过长时间的摸爬滚打,本人研究出一套常用贪心方法(策略),个人感觉很实用。
本人曾凭借它成功拿下过773分。
值得一提的是,贪心在大多数情况下只是一种思想,因此需要一种算法作为媒介才能得以实现。
而我所做的,不过是帮其匹配而已。
No.1 裸搜+ 贪心= 裸贪不要误会,名字纯属娱乐。
说得直接点,就是贪心的思想,用深搜(不加剪枝的深搜称作“裸搜”)来实现。
不要被吓到了。
这是最基础也最常用的贪心策略,关键时刻用它足以左右命运。
[例1]著名的“炒股票”问题。
现在你手里有1000元,在接下来的N天中,你可以选择将手中的现金按当天价格购买股票,也可以将手中的股票兑换成现金。
已知第i天的股票价格为a[i](单位:元/股)。
现求出第N天时手里能拥有的最多现金数量。
1<=N<=15。
这道题很简单,就是一个简单动规。
不过如果有的人用动规做不出来的话(只是“如果”而已,我并不是贬低各位水平~~~),就得考虑——贪心。
首先很容易想到:每天要么全部买进或卖出,要么什么都不做。
因为每天要么会赚(要赚就要多赚点,于是全买或卖),要么不会赔(什么都不做就不会赔了)。
有了这一点,其实动规已经很容易了。
不过呢~~~我就是要贪!怎么办?注意题目的数据范围。
考虑到N的值很小,在深搜可以承受的范围内,于是我们可以用裸贪来解决这道题了。
策略就是:搜索每一天的两种决策,不断替换最优。
一样AC。
[例2]现在有N件工作。
每件工作可能会依赖于其他工作(该工作必须等其所依赖的工作全部结束后才能开始,一个工作最多依赖于10件工作)。
假设1个时刻只能完成一个工作,现在求出第M件工作最早完成的时间。
数据保证没有循环依赖。
初看题,是一个多叉树结构。
有的同学一看跟树有关就甩掉不做了(俗称“树型恐惧症”)。
其实仔细一考虑:没有环,数据也不是太大···那么,从目标点出发搜索所有依赖对象直到目标点的依赖对象全部完成为止,就是一个简单的裸贪问题了,根本用不着什么树。
(当然你要用树我也没办法~~~)由上能够看出裸贪的高效率。
其实,对于一些复杂的动态规划和广搜题目,用裸贪都能取得一定的成效(虽然不一定能AC,比如上面例子中N=1000~~~~)。
对于考试中的应急措施,裸贪可谓首选。
No.2 枚举+ 贪心= 枚贪仿照上面来理解的话就是用枚举的方法来实现贪心。
这个实现起来就更容易了。
枚举嘛,N重循环都能搞的定的东西。
可惜的是,效率不太高,想要AC不容易。
[例1]小S一天一餐只吃N顿饭。
每顿饭会有M份食物供其选择。
这些食物又被分成K类。
根据小M的爸爸规定,小M每顿饭吃第i类食物的数量不能超过a[i]。
每份食物都有一个营养值。
问小M应该怎样安排饮食,使得每顿饭可以获得更多营养值。
有的OIer们一看此题,条件反射般地联想到背包问题,于是不亦乐乎地动态规划ing~~~~停!既然背包问题可以贪心,这个题为什么就不能呢?其实就是一种最低级的贪心策略:每次找能够吃的食物中营养值最大的一份。
还是一个快排,挨个枚举,搞定!很简单吧?不过有的大牛们反而会被这种简单题给迷惑,把思想复杂化了。
所以,简单就好。
[例2]现在有N个数,要求前M个数的乘积刚好等于后N-M个数的乘积,求这样的数序列有多少个。
1<=N<=8。
这是一道典型的优化深搜题。
但是在考场上,有的同学们只能想到深搜,而想不到优化(即裸搜)。
而裸搜是肯定要超时(或者爆掉)的。
怎么办?用枚贪或许可以帮助解决此题。
仔细思考一下:既然搜8个数会挂,那么搜4个行不行呢?如果行,剩下4个又怎么办呢?因此,我们想到:只搜索前M个数,枚举后N-M个数;且当后N-M个数之积已经大于前N个数之积时果断退出。
这样一来,时间复杂度虽然没有太大优化,但空间复杂度大大降低了(搜索深度降低了)。
当时的我因为RP爆发,用枚贪一次AC,实乃幸运(其中有一组是卡着1s的时间过的~~~~)。
在实际操作中,枚贪容易实现但多半不能AC,过5、6组就是运气了。
No.3 模拟+ 贪心= 模贪用模拟来贪心,是一种稍高级的方法。
[例]著名的俄罗斯方块游戏大家都玩过吧?现在有一种简单的方块游戏:有宽度为W的屏幕,有N个边长不一的正方形方块先后从上往下掉,且每一步在保证最大高度尽可能小的情况下尽可能地向左放。
现给出每个方块的边长,请你求出方块掉落完后的最大高度(假设屏幕高度无限)的最小值。
又是一道蛊惑人心的题。
题目最后的“最小值”一词是一个陷阱,让人瞬间误认为是求最优解问题,从而考虑动规。
其实按照题目描述理解的话,此题的答案相对于数据来说是惟一的,贪心策略也显而易见了:每步累加每个宽度对应高度的最大高度,从中找最小的掉落下来。
简单的模拟就能搞定。
因为用模拟的方法来贪心的时候并不多,因此就不多讲了。
大家有兴趣可以亲身体会一下。
No.4 动规+ 贪心= 动贪本年度最高级也最深奥的贪心方法!动规本身就难,还要用动规来贪心,更是难上加难!我向来最讨厌动规,但对于动贪还是不得不罗嗦几句。
没办法,老大啊![例]现在你安排N个人吹M个气球。
已知第i个人每分钟可以吹a[i]个气球,吹一分钟后要休息b[i]分钟。
现在求吹完M个气球所用的最短时间。
当然,每分钟只能有一个人吹气球。
(1<=b[i]<=4) 当初做这道题时,想到低级的枚贪(每次找能吹的人中吹的最多的一个),但是只过了9组。
因此我们想到一个超高级的贪心策略:枚举后4分钟吹气球的人,借以递推求解。
这样一来就完全没有了反例,也不会超时,虽然麻烦了点,但是绝对的AC!动贪的效率是其他贪心方法所远不能及的,也是几乎可以保证AC的贪心方法。
编程复杂度是它的惟一缺陷,因为很有可能在考场上你多半想不出要动贪,即使想出了,冗长的代码也会令你望而却步。
正因如此,动贪才成为了大牛们的终极目标之一。
对于菜菜的本人来说,就算了吧`~~~~掌握好以上三种贪心就行了。
No.5 树论+ 图论+ 贪心= 树图双贪这是一种较少见的贪心方法,因为遇到图论首先想到的是Krim、Floyed、SPFA等高级算法,而不会首选贪心;只有在无可奈何的情况下,才会选择树图双贪来凑合凑合。
虽然是下策,但是不到最后,还不会知道会发生什么呢~~~~~~~~~~~~~~~[例]二叉树有很多种,但是它们很多都是等价的。
某二叉树通过把某非根结点作为根结点而保持其它各结点之间的关系不变,重新建立出一棵树,若这棵树是一棵二叉树,则称这两棵二叉树等价。
现在给出一棵基准二叉树,请你判断给出的其他树是否和它等价。
(图略,因为对于贪心来说不重要~~~)题目叙述相当复杂,即使有示意图,部分OIer们也是一头雾水,于是毅然放弃。
不过没关系,即使不懂题意,仍然可以贪心,因为贪心无极限嘛!此题应该如何贪心呢?首先想到一个树的常用术语——度。
既然只是判断是否等价,那么,统计所有结点的度并比较可不可以呢?肯定是有一定根据的。
这是最简单的贪心策略,效率达到了通过9组之高!这是树型贪心。
再考虑图的常用算法:本题的二叉树变形只是基于各结点间的相互位置,因此我们想到:利用Floyed算法求出两点间的最短距离再加以判断。
这就是图论贪心了。
虽然不太好理解,但是它的效率说明了一切:AC!我们不得不服气了。
贪心就是如此,搞得你很郁闷却又不得不接受现实。
关于树图双贪,就点到为止。
如果哪位大牛有意愿与本人交流一下此方面的问题(因为我是不擅长树论和图论的,所以自然不会用此方法~~~~),请发言。
本人倒是兴致勃勃呢~~~No.6 乱搞+ 贪心= 乱贪?最低级的骗分伎俩,纯属贪图速度,因此效率极低~~~~~当然,乱搞无语,贪心有理,我们还是要见识一下乱贪在关键时刻的威力。
[例](某次模拟赛的一道题)现在老师交给小X一个光荣而艰巨的任务:在规定的T时刻前完成若干项任务。