算法合集之《浅谈贪心思想在动态规划中的应用》
贪心算法在优化问题中的运用
贪心算法在优化问题中的运用贪心算法(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动态规划)如题,贪⼼算法⾪属于提⾼算法效率的⽅法,也常与动态规划的思路相挂钩或⼀同出现。
下⾯介绍⼏个经典贪⼼问题。
(参考⾃刘汝佳著《算法竞赛⼊门经典》)。
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
数据结构-贪心算法和动态规划
重复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]的所有可能切分方
贪心与动态规划算法的主要区别
贪心算法与动态规划算法的主要区别所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是利用贪心算法求解最优解的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
共同点:求解的问题都具有最优子结构性质差异点:动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。
Prim算法O(n2)首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,将顶点j添加到S中。
这个过程一直进行到S=V时为止。
在这个过程中选取到的所有边恰好构成G的一棵最小生成树。
在上述Prim算法中,还应当考虑如何有效地找出满足条件i∈S, j∈V-S,且权c[i][j]最小的边(i,j)。
实现这个目的的较简单的办法是设置2个数组closest和lowcost。
在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改。
Kruskal算法O(eloge)首先将G的n个顶点看成n个孤立的连通分支。
将所有的边按权从小到大排序。
然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。
这个过程一直进行到只剩下一个连通分支时为止。
贪心算法理解贪心算法的基本原理和应用场景
贪心算法理解贪心算法的基本原理和应用场景贪心算法:理解贪心算法的基本原理和应用场景简介:贪心算法(Greedy Algorithm)是一种常用的算法设计和解决问题的方法。
它以一种贪婪的方式做出每一步的选择,希望最终能够达到整体上的最优解。
本文将介绍贪心算法的基本原理和常见应用场景。
一、贪心算法的基本原理贪心算法的基本原理是每次都做出当前最优的选择,希望最终能够达到整体上的最优解。
贪心算法的优点在于简单、高效,但由于它只关注当前最优解,因此可能无法得到全局最优解。
贪心算法的基本步骤如下:1. 将问题划分为若干子问题,每个子问题都有多个选择;2. 分析子问题的选择,以及每个选择的最优解;3. 根据每个子问题的最优解,做出当前最优的选择;4. 更新已做出选择的子问题集合;5. 重复步骤3和4,直到解决全部子问题。
二、贪心算法的应用场景1. 零钱兑换问题零钱兑换问题是指给定一个金额和一组零钱的面值,如何用最少数量的零钱找零。
贪心算法可以从面值最大的零钱开始,每次找零选择当前面值最大的零钱,直到达到目标金额。
2. 区间调度问题区间调度问题是指给定一组区间,如何选择最多数量的不相交区间。
贪心算法可以根据区间的结束时间进行排序,每次选择结束时间最早的区间,并排除与之重叠的其他区间。
3. 背包问题背包问题是指给定一组物品和一个固定容量的背包,如何选择物品放入背包,使得背包中物品的总价值最大。
贪心算法可以通过计算每个物品的单位价值(即物品的价值与重量的比值)来选择单位价值最高的物品放入背包。
4. 最短路径问题最短路径问题是指在一个有向图或无向图中,找到两个节点之间的最短路径。
贪心算法可以使用Dijkstra算法,每次选择离起始节点最近的未访问节点进行扩展,直到找到目标节点。
5. 活动选择问题活动选择问题是指在一组活动中,选出最大的互相兼容的活动子集合。
贪心算法可以根据活动的结束时间进行排序,每次选择结束时间最早的活动,并排除与之重叠的其他活动。
动态规划和贪心算法的区别和优劣比较
动态规划和贪心算法的区别和优劣比较动态规划和贪心算法是两种经典的问题求解方法,本文将从定义、区别、优劣比较等方面来详细介绍这两种算法。
一、定义1.动态规划动态规划是一种将复杂问题分解成小问题来解决的算法。
将复杂的问题转化为一系列小问题,然后逐步解决每个小问题,最后将这些小问题的解合成总问题的解。
动态规划一般用于求解最优化问题,如求最长公共子序列、最长递增子序列以及最短路径等。
2.贪心算法贪心算法是一种贪心思想来解决问题的算法。
贪心算法的基本思想是,每步中都采取当前状态下最优的选择,希望从局部最优解的选择中得到全局最优解。
二、区别虽然两种算法的思想都是分解问题,但是两者在实现、时间复杂度等方面有着显著的区别,具体如下:1.实现动态规划算法一般需要用到递归或者记忆化搜索等技巧,其中递归算法通常需要很多空间存储中间结果,因此空间复杂度较高。
而贪心算法通常只需要一次遍历即可求解,因此实现较为简单。
2.时间复杂度动态规划算法的时间复杂度一般较高,通常是指数量级。
而贪心算法的时间复杂度较低,通常是常数级别,因此时间效率较高。
3.解决问题的特点动态规划算法通常解决目标函数具有最优子结构性质的问题,即当前状态下的最优解包含以前状态下的最优解。
而贪心算法通常解决目标函数具有贪心性质的问题,如局部最优解能够推导出全局最优解等。
三、优劣比较动态规划算法和贪心算法在不同情况下具有不同的优劣性,如下所示:1.动态规划的优劣a.优点(1).解决所有具有最优子结构的问题。
(2).可以在时间复杂度为多项式级别,空间复杂度为常数级别的情况下求解问题。
(3).可以考虑状态转移方程中的所有状态,找到最优解。
b.缺点(1).实现比较困难,需要使用递归和记忆化搜索等技巧。
(2).需要很多空间存储中间状态。
(3).如果没有最优子结构,导致算法无法求解。
2.贪心算法的优劣a.优点(1).实现简单,易于理解。
(2).时间复杂度低,适合对实时性要求较高的问题。
贪心算法和动态规划的区别与联系
贪⼼算法和动态规划的区别与联系
联系
1.都是⼀种推导算法
2.都是分解成⼦问题来求解,都需要具有最优⼦结构
区别
1.贪⼼:每⼀步的最优解⼀定包含上⼀步的最优解,上⼀步之前的最优解则不作保留;
动态规划:全局最优解中⼀定包含某个局部最优解,但不⼀定包含前⼀个局部最优解,因此需要记录之前的所有的局部最优解
2.贪⼼:如果把所有的⼦问题看成⼀棵树的话,贪⼼从根出发,每次向下遍历最优⼦树即可(通常这个“最优”都是基于当前情况下显⽽易见的“最优”);这样的话,就不需要知道⼀个节点的所有⼦树情况,于是构不成⼀棵完整的树;
动态规划:动态规划则⾃底向上,从叶⼦向根,构造⼦问题的解,对每⼀个⼦树的根,求出下⾯每⼀个叶⼦的值,最后得到⼀棵完整的树,并且最终选择其中的最优值作为⾃⾝的值,得到答案
3.根据以上两条可以知道,贪⼼不能保证求得的最后解是最佳的,⼀般复杂度低;⽽动态规划本质是穷举法,可以保证结果是最佳的,复杂度⾼。
4.针对0-1背包问题:这个问题应⽐较选择该物品和不选择该物品所导致的最终⽅案,然后再作出最好选择,由此就导出许多互相重叠的⼦问题,所以⽤动态规划。
从活动选择问题看动态规划和贪心算法的区别与联系
从活动选择问题看动态规划和贪⼼算法的区别与联系这篇⽂章主要⽤来记录我对《算法导论》贪⼼算法⼀章中的“活动选择问题”的动态规划求解和贪⼼算法求解的思路和理解。
主要涉及到以下⼏个⽅⾯的内容:①什么是活动选择问题---粗略提下,详细请参考《算法导论》②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路③活动选择问题的贪⼼算法求解④为什么这个问题可以⽤贪⼼算法求解?⑤动态规划与贪⼼算法的⼀些区别与联系⑥活动选择问题的DP求解的JAVA语⾔实现以及时间复杂度分析⑦活动选择问题的Greedy算法JAVA实现和时间复杂度分析⑧⼀些有⽤的参考资料①活动选择问题给定N个活动,以及它们的开始时间和结束时间,求N个活动中,最⼤兼容的活动个数。
⽐如:活动 i: 1 2 3 4.....开始时间 si: 1 3 0 5....结束时间 fi: 4 5 6 7.....活动1的开始时间s(1)=1,结束时间f(1)=4,它与活动2是不兼容的。
因为,活动1还没有结束,活动2就开始了(s(2) < f(1))。
活动2 与活动4 是兼容的。
因为,活动2的进⾏区间是[3,5) ⽽活动4的进⾏区间是[5,7)⽬标是:在N个活动中,找出最⼤兼容的活动个数。
②活动选择问题的DP(Dynamic programming)求解1)建模活动 i ⽤ a(i)来表⽰,开始时间⽤ s(i)表⽰,结束时间⽤ f(i)表⽰,所有活动的集合为S定义⼀个合适的⼦问题空间,设 S(i,j) 是与 a(i) 和 a(j)兼容的活动集合。
S(i,j)={a(k), a(k) belongs to S: f(i)<=s(k)<f(k)<=s(j)}2)问题⼀般化(不是很理解)这⾥第⼀个活动和最后⼀个活动有点特殊。
为了完整表⽰问题,构造两个虚拟的活动: a(0) 和 a(n+1)其中,s(0)=f(0)=0,s(n+1)=f(n+1)=Integer.MAX_VALUE于是,S=S(0,n+1),从N个活动中找出最⼤兼容的活动,就转化成了求解 S(0,n+1)集合中包含的最多元素个数3)⼦问题分析假设所有的活动都按结束时间递增排序。
背包问题贪心法和动态规划方案法求解
背包问题贪心法和动态规划方案法求解嘿,大家好!今天咱们来聊聊那个让人又爱又恨的背包问题。
这个问题可是算法领域的经典难题,不过别怕,今天我会用贪心法和动态规划两种方法帮你轻松搞定它!来个简单直接的背景介绍。
背包问题,简单来说,就是给定一组物品,每个物品都有一定的价值和重量,你需要在不超过背包承载重量的前提下,挑选出价值最大的物品组合。
听起来是不是有点像生活中的购物决策?哈哈,没错,这就是背包问题的魅力所在。
好,下面咱们直接进入主题。
一、贪心法贪心法,顾名思义,就是每一步都选择当前看起来最优的方案。
对于背包问题,贪心法的核心思想就是:每次都选取价值密度最大的物品。
1.计算每个物品的价值密度,即价值除以重量。
2.然后,按照价值密度从大到小排序。
3.从排序后的列表中依次选取物品,直到背包装满或者没有物品可选。
二、动态规划法动态规划,这是一种更加严谨、也更复杂的方法。
它的核心思想是:通过把大问题分解成小问题,逐步求解,最终得到最优解。
1.定义一个二维数组dp[i][j],表示在前i个物品中选择,背包容量为j时的最大价值。
2.我们考虑第i个物品是否放入背包。
如果放入,则前i-1个物品在容量为j-w[i]时的最大价值加上w[i]的价值,即dp[i][j]=dp[i-1][j-w[i]]+w[i]。
如果不放入,则前i-1个物品在容量为j时的最大价值,即dp[i][j]=dp[i-1][j]。
3.通过比较这两种情况,取最大值作为dp[i][j]的值。
整个过程中,我们需要遍历所有物品和所有可能的背包容量,最终得到dp[n][W]就是我们要找的最大价值。
现在,让我们用一段代码来具体实现一下动态规划法:defknapsack(W,weights,values):n=len(values)dp=[[0for_inrange(W+1)]for_inrange(n+1)]foriinrange(1,n+1):forjinrange(1,W+1):ifj>=weights[i-1]:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weights[i-1]]+values[i -1])else:dp[i][j]=dp[i-1][j]returndp[n][W]测试数据W=50weights=[10,20,30]values=[60,100,120]print(knapsack(W,weights,values))怎么样?是不是觉得动态规划法虽然复杂,但逻辑清晰,更容易找到最优解?通过上面的分析,我们可以看到,贪心法简单高效,但有时候并不能得到最优解;而动态规划法虽然计算复杂度较高,但可以得到最优解。
贪心法与动态规划.ppt
其缺点是计算比较复杂。
问题提出
实际上,求从A到E的最短距离问题,可以转化为 两个性质完全相同,但规模较小的子问题
即分别从B1、B2到E的最短路径问题,这时,从A 到E的最短距离(记为SD(A))问题可以表示为:
SD(
A)
min
例要如进,行d假ijk设-1与Dkd-1ik中k-1第+ id行kjk第-1的j列大的小值比为较d,ijk-1取,它增们加中顶的点小vk者后为,d需ijk, 即有如下迭代公式:
dijk = min{ dijk-1, dikk-1+ dkjk-1} 0≤k≤n-1
(6-1)
程序实例
输入顶点个数:(最大输入数为:5) 5 依次输入顶点名: ABCDE 输入边数: 7 按"head tail weight"的方式输入边信息: A B 10 A D 30 A E 100 B C 50 C E 10 D C 20 D E 60 图中所有边如下: (A,B,10)(A,D,30)(A,E,100) (B,C,50) (C,E,10) (D,C,20)(D,E,60)
应用举例 - 多源最短路径
1)问题描述
所谓多源最短路径问题就是指对于一个给定的非负有向网 图,求出任意两个结点之间的最短路径。
目前,对于多源最短路径问题更直接的做法是使用 Warshall-Floyd算法。
其中,Warshall算法是一个用于求图的传递闭包的算法。 而求任意两个顶点之间的最短路径的Floyd(弗洛伊德)算法 与Warshall算法非常相似,所以通常称Floyd算法为 Warshall-Floyd算法。
② 使用分治法时,由原问题分解出的各子问题通常是相互独立的,即 不包含公共的子问题,因此一旦递归地求出各子问题的解后,便可自 下而上地将各子问题的解合并成问题的解。如果各子问题不是相互独 立的,则分治法要做许多不必要的工作,重复地求解公共的子问题。
贪婪的动态规划
贪婪的动态规划——浅谈贪心思想在动态规划中的应用浙江省绍兴县柯桥中学黄劲松【关键字】贪心法,动态规划,状态,时间复杂度【摘要】贪心法和动态规划是信息学竞赛中的两种常用算法,本文着重讨论了贪心的思想是如何巧妙的运用到动态规划的解题中的。
全文分三个部分,首先讨论了贪心思想运用到动态规划解题中的可行性和必要性,然后就贪心思想在动态规划中的两种基本应用分别做了举例说明,最后总结全文。
【正文】引言贪心法和动态规划是信息学竞赛中的常用经典算法,而当某些问题的模型过于复杂的时候,由于状态过于庞大、转移困难等一系列的问题,常规的动态规划难于甚至无从下手。
而在这个时候,巧妙的使用贪心思想,将其融入到动态规划的解题中,动态规划便焕发出了新的光彩。
1、贪心思想运用到动态规划中的必要性和可行性动态规划的原理是:在求解问题的过程中,通过处理位于当前位置和所达目标之间的中间点来找到整个问题的解。
整个过程是递归的,每到一个新的中间点都是已访问过的点的一个函数。
适合于动态规划法的标准问题必须具有下列特点:●1、整个问题的求解可以划分为若干个阶段的一系列决策过程。
●2、每个阶段有若干可能状态。
●3、一个决策将你从一个阶段的一种状态带到下一个阶段的某种状态。
●4、在任一个阶段,最佳的决策序列和该阶段以后的决策无关。
●5、各阶段状态之间的转换有明确定义的费用在实际的动态规划的解题中,面临着两大困难:一是不知道题目是否可以用动态规划求解;二是即使能够想到用动态规划来求解,但是因为种种因素,算法的效率并不乐观。
这个时候,使用贪心思想分析问题,可以让你在山穷水尽疑无路的时候,柳暗花明又一村。
在运用贪心思想的时候,主要是分析出问题的一些本质,或者分析出低效算法的一些冗余。
当然,我们要根据题目的特殊信息,合理的运用好贪心思想,才能帮助动态规划发挥其强大的功效。
下文就贪心思想如何解决动态规划面临着的这两大困难分别做了举例说明。
2、贪心思想在动态规划中的应用一:确立状态动态规划当中,状态的确立是重点,而在实际的解题过程中,状态的信息往往是隐含的,这个时候,合理的运用贪心思想,可以迅速的从繁芜丛杂的问题背景中巧妙地抽象出状态。
动态规划与贪心算法的区别
动态规划与贪⼼算法的区别动态规划:动态规划应⽤于⼦问题重合的情况,不同的⼦问题具有相同的⼦⼦问题,动态规划算法将每个⼦问题求解⼀次,将其解保存在⼀个表格中,需要时进⾏调⽤。
刻画⼀个最优解的结构特征。
递归的定义最优解的值。
计算最优解的值,有⾃顶向下和⾃底向上的⽅法,通常采⽤⾃底向上的⽅法。
⼀、DP思想:1、把⼀个⼤的问题分解成⼀个⼀个的⼦问题。
2、如果得到了这些⼦问题的解,然后经过⼀定的处理,就可以得到原问题的解。
3、如果这些⼦问题与原问题有着结构相同,即⼩问题还可以继续的分解。
4、这样⼀直把⼤的问题⼀直分下去,问题的规模不断地减⼩,直到⼦问题⼩到不能再⼩,最终会得到最⼩⼦问题。
5、最⼩⼦问题的解显⽽易见,这样递推回去,就可以得到原问题的解。
贪⼼算法:每⼀步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。
贪⼼算法的设计步骤:对其作出⼀个选择后,只剩下⼀个⼦问题需要求解。
证明做出贪⼼选择后,原问题总是存在最优解,即贪⼼选择总是安全的。
剩余⼦问题的最优解与贪⼼选择组合即可得到原问题的最优解。
联系:都是分解成⼦问题来求解,都需要具有最优⼦结构所有的贪⼼问题都可以⽤动态规划来求解,可以这么说,贪⼼算法是动态规划的特例。
区别:1.贪⼼:每⼀步的最优解⼀定包含上⼀步的最优解,上⼀步之前的最优解则不作保留;动态规划:全局最优解中⼀定包含某个局部最优解,但不⼀定包含前⼀个局部最优解,因此需要记录之前的所有的局部最优解也就是说,假如你要求第⼗步的最优解,那么第⼗步的最优解肯定与第九步的最优解有关,⽽第九步的最优解肯定与第⼋步的最优解有关。
可以这么理解,贪⼼算法第⼗步的最优解得把前⾯九步的最优解都⽤上了,但是动态规划你需要求第⼗步的最优解,这个最优解可能只与第⼋步,第三步,第⼀步有关,与第九步没有关系,我们为什么选择第⼋步⽽不选择第九步呢?是因为我们在计算第⼗步的最优解的时候其实把1-9步的组合的情况都计算了,选择了其中最优的解,也就是第⼋步的解,其实第⼗步解的构成与第九步没有关系,动态规划相当于穷举了1-9步最优情况下的组合,选了其中最优的作为第⼗步的最优解,⽽贪⼼算法第⼗步的最优解肯定是由第九步构成的。
贪心法解决活动安排问题
运用贪心算法解决活动安排问题李文治,陈平,谢华欣,韩月梅(陕西师范大学计算机科学学院09级软件工程,西安,710062)摘要:生活中经常可以遇到这样一些问题,需要对一些资源进行优化分配已达到资源利用率的最大化。
如对会场会议的安排、对赛场比赛的安排、课程的安排、以及扩展到电脑中操作系统对不同进程资源的分配问题。
使用贪心算法可以很快的解决此类安排问题。
关键词:活动安排安排;贪心算法;Using the greedy algorithm to solve the problem of activityarrangementLi Wenzhi, Chen Ping, Xie Huaxin, Han Y uemei( Shaanxi Normal University computer science institute of software engineering, Xi'an, 710062)Abstract:life can often encounter such problems, the need for some resource optimized allocation has achieve the maximization of resource utilization. As for the meeting venue arrangement, the Games arrangement, the arrangement of the courses, as well as an extension to the computer operating system on the process of different resource allocation problems. The use of greedy algorithm can quickly solve such arrangements.Keywords:activity arrangement; greedy algorithm;1引言生活中经常可以遇到这样一些问题,需要对一些资源进行优化分配已达到资源利用率的最大化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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]