算法合集之《浅谈贪心思想在动态规划中的应用》

合集下载

贪心算法在优化问题中的运用

贪心算法在优化问题中的运用

贪心算法在优化问题中的运用贪心算法(Greedy Algorithm)是一种常用的算法思想,它在解决一些优化问题时具有很高的效率和实用性。

贪心算法的核心思想是每一步都选择当前状态下最优的解决方案,以期望最终能够得到全局最优解。

在实际应用中,贪心算法常常被用来解决一些最优化问题,如最短路径问题、背包问题、任务调度等。

本文将介绍贪心算法在优化问题中的运用,并通过具体案例来说明其应用场景和解决方法。

一、贪心算法的基本原理贪心算法是一种在每一步选择当前状态下最优解决方案的算法思想。

它与动态规划不同,贪心算法并不会保存之前的计算结果,而是根据当前状态做出最优选择。

贪心算法的优势在于简单、高效,适用于一些特定类型的问题。

贪心算法的基本原理可以总结为以下几点:1. 每一步都选择当前状态下的最优解决方案;2. 不考虑未来的结果,只关注当前状态的最优选择;3. 最终期望通过每一步的最优选择达到全局最优解。

二、贪心算法在优化问题中的应用1. 最短路径问题最短路径问题是图论中的经典问题,贪心算法可以用来解决一些简单的最短路径问题。

例如,在无权图中,从起点到终点的最短路径可以通过贪心算法来求解,每次选择距离最近的节点作为下一步的目标节点,直到到达终点为止。

2. 背包问题背包问题是一个经典的优化问题,贪心算法可以用来解决一些特定类型的背包问题。

例如,在分数背包问题中,每种物品可以取任意比例,贪心算法可以按照单位价值最高的顺序选择物品放入背包,直到背包装满为止。

3. 任务调度问题任务调度问题是一个常见的优化问题,贪心算法可以用来解决一些简单的任务调度问题。

例如,在单处理器任务调度中,每个任务有一个开始时间和结束时间,贪心算法可以按照结束时间的先后顺序对任务进行调度,以最大化处理器的利用率。

三、案例分析:活动选择问题活动选择问题是一个经典的优化问题,通过贪心算法可以高效地解决。

问题描述如下:假设有n个活动,每个活动都有一个开始时间和结束时间,活动之间不能交叉进行,问如何安排活动才能使参加的活动数量最多。

算法分析与设计—动态规划研究

算法分析与设计—动态规划研究

基于贪心算法的动态规划问题研究摘要:贪心算法的基本思想是将待求解问题时,总是进行局部最优选择,下一步的结果都是从上一步的结果推导出来的,且不可取消。

值得注意的是,贪心算法做出的仅仅是某种意义上的局部最优解,并不一定对所有问题都能得到整体最优解,但是对一些问题能够产生整体最优解或整体最优解的近似解。

本文对贪心思想在动态规划中的必要性和可行性进行分析,并利用贪心算法对背包问题进行深入研究。

关键词:动态规划 贪心算法 背包问题 最优解二 贪心思想运用到动态规划中的必要性和可行性动态规划的原理是:在求解问题的过程中,通过处理位于当前位置和所达目标之间的中间点来找到整个问题的解。

整个过程是递归的,每到一个新的中间点都是已访问过的点的一个函数。

适合于动态规划法的标准问题必须具有下列特点:1、整个问题的求解可以划分为若干个阶段的一系列决策过程。

2、每个阶段有若干可能状态。

3、一个决策将你从一个阶段的一种状态带到下一个阶段的某种状态。

4、在任一个阶段,最佳的决策序列和该阶段以后的决策无关。

5、各阶段状态之间的转换有明确定义的费用 在实际的动态规划的解题中,面临着两大困难:一是不知道题目是否可以用动态规划求解;二是即使能够想到用动态规划来求解,但因种种因素,算法的效率并不好。

那么使用贪心思想分析问题,但是对一些问题能够产生整体最优解或整体最优解的近似解。

三 贪心算法要素(1)贪心选择性质 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来实现。

对于一个具体的问题,要确定它是否具有贪心性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。

(2)最优子结构性质 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。

四 背包问题描述给定n 种物品和一个背包,物品i 的重量为i w ,其价值为i v ,背包的容量为c ,问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?对物品i 来说,可以全部装入背包,或部分装入背包。

贪心算法与动态规划

贪心算法与动态规划

Ones
让 f[i] 表示最少数量的 1 能够表示 i 。 add: f[i]=f[j]+f[i-j] 0<j<i multiply: f[i]=f[j]+f[i/j] 0<j<i, i%j=0 for(i=1;i<=n;i++){ f[i]=i; for(j=1;j<i;j++){ f[i]=min(f[i],f[j]+f[i-j]); if (i%j==0) f[i]=min(f[j]+f[i-j]); } } O(n2) n<=10000
• 动态规划算法的基本要素 • ( 1 )最优子结构性质 • ( 2 )重叠子问题性质 • 掌握设计动态规划算法的步骤。 • (1) 找出最优解的性质,并刻划其结构特征。 • (2) 递归地定义最优值。(写出动态规划方程); • (3) 以自底向上的方式计算出最优值。 • (4) 根据计算最优值时得到的信息,构造最优解。
相关题目
1574 一食堂宣传栏 1230 区间相交问题
FOJ 1106 Sum of Factorials
问一个数能否由相应的阶乖的和组合而成 列表 {1,1,2,6,24,120,720,5040,40320,362880}; 将 N 尝试性的减去表中的数,为零则 YES ,否则为 NO 证明?
若要用贪心算法求解某问题的整体最优解 ,必须首先证明贪心思想在该问题的应用 结果就是最优解!!
1316Tian Ji -- The Horse Racing 1541Exploration 1505Minimum value
动态规划 ( Dynamic Programming )

关于贪心算法的经典问题(算法效率or动态规划)

关于贪心算法的经典问题(算法效率or动态规划)

关于贪⼼算法的经典问题(算法效率or动态规划)如题,贪⼼算法⾪属于提⾼算法效率的⽅法,也常与动态规划的思路相挂钩或⼀同出现。

下⾯介绍⼏个经典贪⼼问题。

(参考⾃刘汝佳著《算法竞赛⼊门经典》)。

P.S.下⽂皆是我⼀个字⼀个字敲出来的,绝对“童叟⽆欺”,哈哈。

(。

⌒∇⌒) 耗费了我的很多时间,所以——希望对⼤家有帮助啊~ (=^‸^=)⼀、背包相关问题1.最优装载问题:给出N个物体,有⼀定重量。

请选择尽量多的物体,使总重量不超过C。

解法:只关⼼数量多,便把重量从⼩到⼤排序,依次选,直到装不下。

2.部分背包问题:给出N个物体,有⼀定重量和价值。

请选择⼀些物体的⼀部分使在总重量不超过C的条件下总价值最⼤。

解法:关⼼总价值⼤,物体可取部分,便优先取单位重量价值较⼤的物体。

3.乘船问题:有N个⼈,有⼀定重量。

每艘船的最⼤载重量均为C,且最多载2⼈。

请⽤最少的船装载所有⼈。

解法:关⼼数量少,要尽量使每艘船的实际载重量尽量接近于最⼤载重量。

便把重量从⼩到⼤排序,每艘船依次先载⼀个⼈,再载重量最接近船的剩余可载重量的⼈。

这样可以使眼前的消费(剩余载重量)最少。

实现:⽤2个变量 l , r 分别从两头往中间移动,l 和 r 可共乘⼀艘船,或 r ⾃⼰乘⼀艘船。

⼆、区间相关问题1.选择不相交区间:数轴上有N个开区间(Li,Ri),请选择尽量多个区间,并保证这些区间两两没有公共点。

解法:先把这些区间按找 Ri 从⼩到⼤的顺序排序,再对按序排列的每2个区间A,B分情况讨论:(1)A被B包含,选A最优;(2)A右边的⼀部分与B左边的⼀部分相交,选A最优,因为选A⽐B减少了与后⾯区间相交的可能性;(3)A、B不相交,便2个都选。

总的来说就是排序后,从左到右选第⼀个没有与前⾯已选的区间相交的区间。

O(n)。

拓展:那么如果可以⼀共覆盖两次,那该怎么选? ——也就是。

2.区间选点问题:数轴上有N个闭区间[Li,Ri],请选择尽量少的点,使得每个区间内都⾄少有⼀个点。

贪心算法与动态规划

贪心算法与动态规划

贪⼼算法与动态规划接下来学习贪⼼算法和动态规划,学习的过程中由于看的是录播,发现⽼师上课发现⼈有些没来有些许失落,下次在没有确定有充⾜时间的情况下,取消⼀切⽹络课程的报名。

贪⼼算法贪⼼算法在求解某个问题时,总是做出眼前的最⼤利益,也就是说只顾眼前不顾⼤局,所以他是局部最优解。

贪⼼算法不是对所有问题都能得到整体最好的解决办法,关键是贪⼼策略的选择,选择的贪⼼策略必须具备⽆后效性,即某个状态以前的状态不会影响以后的状态,只与当前状态有关。

贪⼼算法两个重要的特点是:(1)贪⼼策略(2)通过局部最优解能够得到全局最优解会议安排问题有N个同等级的会议需要在同⼀天使⽤同⼀个会议室,现在给出这N个会议的开始时间和结束时间,怎么样才能使会议室最⼤利⽤,安排最多场次的会议?分析:这个问题需要⽤到贪⼼算法,即先将这些会议根据结束时间⾃然排序,肯定是先安排最先结束的,如果最先安排最后结束的,那如果⼀个会议开的很久,那本来可以多安排⼏场结果全被这个占了,显然不是最优的选择,因此优先安排会议先结束的才是合理的。

然后接着在剩余的场次⾥判断会议开始时间是否在当前会议结束时间之后,如果在后⾯说明可以继续安排,下⾯就是代码实现。

(1)定义会议实体类,需要实现Comparable接⼝。

1/**2 * 会议类,需实现Comparable接⼝3*/4public class Meeting implements Comparable<Meeting>{5//定义会议属性6private int number;7private int starTime;8private int endTime;910//get set⽅法11public int getNumber() {12return number;13 }1415public void setNumber(int number) {16this.number = number;17 }1819public int getStarTime() {20return starTime;21 }2223public void setStarTime(int starTime) {24this.starTime = starTime;25 }2627public int getEndTime() {28return endTime;29 }3031public void setEndTime(int endTime) {32this.endTime = endTime;33 }3435//构造⽅法36public Meeting(int number, int starTime, int endTime) {37this.number = number;38this.starTime = starTime;39this.endTime = endTime;40 }4142 @Override43public String toString() {44return "Meeting{" +45 "number=" + number +46 ", starTime=" + starTime +47 ", endTime=" + endTime +48 '}';49 }50//需要重写接⼝的⽅法51 @Override52public int compareTo(Meeting o) {53//按照会议结束时间升序排列54if(this.endTime>o.endTime){55return 1;56 }57if(this.endTime<o.endTime){58return -1;59 }60return 0;61 }62 }(2)测试类,⾥⾯实现动态规划算法。

算法设计贪心算法的思想与实现

算法设计贪心算法的思想与实现

算法设计贪心算法的思想与实现算法是计算机科学领域中的核心概念,它指导着解决问题的方法和步骤。

贪心算法是一种常用的算法设计思想,它在求解最优化问题时,每一步都采取当前状态下最优的选择,希望得到全局最优解。

本文将介绍贪心算法的思想和实现方式,并通过一个实际问题的案例来说明其应用。

一、贪心算法的思想贪心算法是一种贪心思想的应用,即每一步都做出在当前看来最好的选择。

它不关心整体的结果,只关心当下最优解。

贪心算法通常可以通过以下三个步骤实现:1. 贪心选择策略:在每一步中,通过一定的策略选择当前看来最优的解。

2. 确定限制条件:确定所得到的选择是否满足问题的限制条件。

3. 最优子结构:通过贪心选择策略,将原问题分解为若干子问题,每个子问题都具有最优子结构。

贪心算法的核心思想在于每一步都是局部最优解,通过一系列局部最优解,最终得到全局最优解。

然而,贪心算法并不能保证得到全局最优解,只适用于满足贪心选择策略、具有最优子结构和无后效性的问题。

二、贪心算法的实现贪心算法的实现通常分为以下几个步骤:1. 建立数学模型:通过数学表达式对问题进行建模。

2. 确定贪心选择策略:根据问题的特点和要求,确定一种贪心选择策略。

3. 构造贪心算法:根据贪心选择策略,构造出一个贪心算法来求解问题。

4. 证明算法的正确性:通过数学证明等方式,证明贪心算法得到的解是问题的最优解。

三、贪心算法的应用贪心算法可以应用于众多实际问题的求解,例如最小生成树、最短路径、背包问题等。

下面以活动选择问题为例来说明贪心算法的应用。

假设有n个活动,每个活动都有一个开始时间和结束时间。

要求从这些活动中选择出最多的互不冲突的活动(即活动之间不能出现时间上的重叠),请设计一个贪心算法来解决该问题。

算法步骤:1. 将活动按照结束时间的先后顺序进行排序。

2. 选择第一个活动作为已安排的活动。

3. 从剩余的活动中选择结束时间与已安排活动的开始时间不重叠的活动,将其加入到已安排的活动中。

算法合集之《浅谈贪心思想在动态规划中的应用》

算法合集之《浅谈贪心思想在动态规划中的应用》
贪婪的动态规划
——浅谈贪心思想在动态规划中的应用 绍兴县柯桥中学 黄劲松
引言
在动态规划的解题中我们面临着两大困难
1、不知道是否可以用动态规划求解 2、直观的动态规划算法过于低效
在这个时候,巧妙的使用贪心思想,将其 融入到动态规划中,动态规划便焕发出了 新的光彩
目录
贪心思想在动态规划中的应用
Fa[u] ( ((Fb[S j ] 2) 1) Leaves Si ] Fa[Si ]) [
i 1 j 1
k
i 1
Fb[u]的值与访问顺序无关
[例四] The Lost House
问题的关键是如何决定儿子的访问顺序 一种直观的方法是枚举所有可能访问顺序, 复杂度是O(nk!),实在是很低效 上述算法存在冗余, 我们再用一次动态规划 的话,可以将复杂度降为O(n2kk),勉强可 以接受了
确立状态
[例一]青蛙的烦恼(详见论文) [例二]The Horse Racing
优化算法
[例三]石子归并(详见论文) [例四]The Lost House
贪心思想在动态规划中的应用一: 确立状态 动态规划当中,状态的确立是重点 而在实际的解题过程中,状态信息往往是 隐含的 这个时候,合理的运用贪心思想,可以迅 速的从繁芜丛杂的问题背景中巧妙地抽象 出状态
f[i, j] max{f[i-1, j] g[n - (i - j) 1,i], f[i -1, j -1] g[j, i]}
其中g[i,j]表示齐王和田忌的马分别按由强到弱的顺序排 序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得 的盈利,胜为200,负为-200,平为0。
(3+2+4)/3 = 3

数据结构-贪心算法和动态规划

数据结构-贪心算法和动态规划
选择最小的dist[u]:记dist[v]是最小的,则v是当 前找到的不在V中且距离S最近的结点,更新 V=V∪{v},调整 dist[u]=min{dist[u],dist[v]+graph[v][u]};
重复n-1次。
18/65
贪心法的 思考 可以看到,在从Ai到Ai+1的扩展过程中,上
贪心法和动态规划
1/65
主要内 容 动态规划和贪心的认识
工具:马尔科夫过程
贪心法
Prim算法 Kruskal算法 Dijkstra算法
动态规划
最长递增子序列LIS 矩阵连乘的最少乘法 字符串的交替连接 走棋盘/格子取数问题及其应用 带陷阱的走棋盘问题 两次走棋盘问题 Catalan数简介
15/65
贪心 法 根据实际问题,选取一种度量标准。然后按照这种
标准对n个输入排序,并按序一次输入一个量。 如果输入和当前已构成在这种量度意义下的部分最
优解加在一起不能产生一个可行解,则不把此输入 加到这部分解中。否则,将当前输入合并到部分解 中从而得到包含当前输入的新的部分解。 这一处理过程一直持续到n个输入都被考虑完毕, 则记入最优解集合中的输入子集构成这种量度意义 下的问题的最优解。 这种能够得到某种量度意义下的最优解的分级处理 方法称为贪心方法。
是否合法。
如: 2.5.5.25511135,才能判断出是非法的。
当然,它可以通过“25511135”大于“255.255”等其他限界 条件“事先”判断。
10/65
DFS与DP深刻 认识 DFS的过程,是计算完成了str[0…i]的切分,然后
递归调用,继续计算str[i+1,i+2…n-1]的过程; 而DP中,假定得到了str[0…i-1]的所有可能切分方
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fa[uF] =b[i0]表; F示b[蜗u]牛= 的0; 房子不在i为根的子树上的期望步数 for i 和= 1(to也k就d是o 遍历该子树需要的时间,如果i处有虫子, begin那么Fb[i]=0)
Fa用[uL] e=aFveas[u[i]] +表(示Fbi[为u]根+的1)子×树L上ea叶ve子s[节S[点i]] 的+ 数Fa目[S。[i]]; Fb问[u题] =的F解b[答u] 就+ F是bF[Sa[i根]] +结2点; ]/Leaves[根结点]。 end;
田忌 齐王
把田忌的马放左边,把齐王的 马放右边
时间复杂度过大,无法满足要求 如果田忌的马胜,则连一条 权为200的边;
如果平局,则连一条权为0 的边;
如果输,则连一条权为-200 的边。
[例二] The Horse Racing
运用贪心思想分析问题:
田忌掌握有比赛的“主动权”,他总是根据齐王所出的
用f[i,j]表示齐王出了i匹较强的马和田忌的j匹较强的马, i-j匹较弱的马比赛之后,田忌所能够得到的最大盈利。
f[i, j] max{f[i-1, j] g[n - (i - j) 1,i], f[i-1, j-1] g[j,i]}
其中g[i,j]表示齐王和田忌的马分别按由强到弱的顺序排 序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得 的盈利,胜为200,负为-200,平为0。
小结1
抛弃了原本直观而低效的算法
结合贪心思想分析问题
用合理的假设得到了“田忌出马不是出最强,就 是出最弱”的信息
因此得知可以用动态规划求解且确立出动规状态
贪心思想在动态规划中的应用二: 优化算法
一些题目虽然容易确立出状态以及轻松的 写出状态转移方程,但是直观上的算法往 往效率不高
[例四]The Lost House
Worm Said : No!
(3+2+4)/3 = 3
Worm Said : Yes!
[例四]The Lost House
如不果难结分点析u出有本k个题儿是子用,我树们型按动照态S规[1划]..来S[k求]进解行。访 问,FFa[ai][表u]示的蜗计牛算的方房式子在是i为:根的子树上的期望步数和
贪婪的动态规划
——浅谈贪心思想在动态规划中的应用 绍兴县柯桥中学 黄劲松
引言
在动态规划的解题中我们面临着两大困难
1、不知道是否可以用动态规划求解 2、直观的动态规划算法过于低效
在这个时候,巧妙的使用贪心思想,将其 融入到动态规划中,动态规划便焕发出了 新的光彩
目录
贪心思想在动态规划中的应用
房子遗失在每个叶子结点 的概率都是相等的
求蜗牛找到房子的最小数 学期望步数(走过一条边 算作一步)
[例四]The Lost House
(1+4+6)/3 = 11/3 这种走法没有充分发挥蜗牛虫从子根结在点这1出里发的开始作寻用找!它的房子
它的房子可能遗失在叶结点2、4、5上 在结点3上住着一只虫子,它会告诉蜗 牛,房子是否在以3为根的子树上
马来分配自己的马去对抗齐王的马 可以假设齐王按照马的强弱顺序由强到弱出马
田忌最强的马 输能战给赢平 齐王最强的马
用田忌最强的马去打平齐王最强的马 用田忌最差 强的马去或输战者给胜齐王最强的马 用田忌最差的马去输给齐王最强的马
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存在反例
光是打平比赛
田忌的马 1 2 3 齐王的马 1 2 3
收益为0200
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存在反例
光是输掉比赛
田忌的马 2 3 齐王的马 1 3
收益为2000
[例二] The Horse Racing
“田忌出马不是出最强的,就是出最弱的”
确立状态
[例一]青蛙的烦恼(详见论文) [例二]The Horse Racing
优化算法
[例三]石子归并(详见论文) [例四]The Lost House
贪心思想在动态规划中的应用一: 确立状态
动态规划当中,状态的确立是重点 而在实际的解题过程中,状态信息往往是
隐含的
这个时候,合理的运用贪心思想,可以迅 速的从繁芜丛杂的问题背景中巧妙地抽象 出状态
而贪心历来是与高效一词密不可分的
运用好贪心思想能够使原来效率低下的算 法得到重生
[例四]The Lost House
蜗牛从根结点出发开始寻 找它遗失在某个叶子结点 的房子
一些中间结点上住着的虫 子会告诉蜗牛它的房子是
否树在上以的这结个点点为个根数的n子最树多为1000,每个结点 上的分叉数k最多为8。
k i1
Fa[u] ( ((Fb[S j ] 2) 1) Leaves[Si ] Fa[Si ]) i1 j1
Fb[u]的值与访问顺序无关
[例四] The Lost House
问题的关键是如何
复杂度是O(nk!),实在是很低效 上述算法存在冗余, 我们再用一次动态规划
[例二]The Horse Racing
齐王和田忌各派出N匹马(N≤2000) 每匹马都有一个固定的速度值 每场比赛,输的一方将要给赢的一方200两黄金,如果
是平局的话,双方都不必拿出钱 请你扮演一下孙膑,帮助田忌赢最多的钱
[例二] The Horse Racing
这个问题很显然可以转化成一 个二分图最佳匹配的问题
的话,可以将复杂度降为O(n2kk),勉强可 以接受了
[例四] The Lost House
运用贪心思想分析问题
u
元素之1 间2 存。在。。可v比v性+1 ,。。且。 可k 比 性存在着传递性,因此可以确 (F另前对这因在b定此我[v一,交只此S时们的v出个可换如跟]F考前a结以前果元[虑一2S面)1一论推后交素..k个]L种和v:导的换e和访aFF如出后全vbv问ae[+A果的Ss[顺1序u[1一.S本.A值]k序值v]的一定关身1优中]做值定放的的秀系差都(放在两F信的已b个在C[息话知S前相Bv有,,1邻前。]F关那元a,[2!么u素)B]的vv一+和L值e1定va一待+v放1e定定s在[放SvC]
相关文档
最新文档