ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:132.17KB ,
资源ID:23998901      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23998901.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(贪婪的动态规划.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

贪婪的动态规划.docx

1、贪婪的动态规划贪婪的动态规划浅谈贪心思想在动态规划中的应用浙江省绍兴县柯桥中学 黄劲松【关键字】贪心法,动态规划,状态,时间复杂度【摘要】贪心法和动态规划是信息学竞赛中的两种常用算法,本文着重讨论了贪心的思想是如何巧妙的运用到动态规划的解题中的。全文分三个部分,首先讨论了贪心思想运用到动态规划解题中的可行性和必要性,然后就贪心思想在动态规划中的两种基本应用分别做了举例说明,最后总结全文。【正文】引言贪心法和动态规划是信息学竞赛中的常用经典算法,而当某些问题的模型过于复杂的时候,由于状态过于庞大、转移困难等一系列的问题,常规的动态规划难于甚至无从下手。而在这个时候,巧妙的使用贪心思想,将其融入到

2、动态规划的解题中,动态规划便焕发出了新的光彩。1、贪心思想运用到动态规划中的必要性和可行性动态规划的原理是:在求解问题的过程中,通过处理位于当前位置和所达目标之间的中间点来找到整个问题的解。整个过程是递归的,每到一个新的中间点都是已访问过的点的一个函数。适合于动态规划法的标准问题必须具有下列特点: 1、整个问题的求解可以划分为若干个阶段的一系列决策过程。 2、每个阶段有若干可能状态。 3、一个决策将你从一个阶段的一种状态带到下一个阶段的某种状态。 4、在任一个阶段,最佳的决策序列和该阶段以后的决策无关。 5、各阶段状态之间的转换有明确定义的费用在实际的动态规划的解题中,面临着两大困难:一是不知

3、道题目是否可以用动态规划求解;二是即使能够想到用动态规划来求解,但是因为种种因素,算法的效率并不乐观。这个时候,使用贪心思想分析问题,可以让你在山穷水尽疑无路的时候,柳暗花明又一村。在运用贪心思想的时候,主要是分析出问题的一些本质,或者分析出低效算法的一些冗余。当然,我们要根据题目的特殊信息,合理的运用好贪心思想,才能帮助动态规划发挥其强大的功效。下文就贪心思想如何解决动态规划面临着的这两大困难分别做了举例说明。2、贪心思想在动态规划中的应用一: 确立状态动态规划当中,状态的确立是重点,而在实际的解题过程中,状态的信息往往是隐含的,这个时候,合理的运用贪心思想,可以迅速的从繁芜丛杂的问题背景中

4、巧妙地抽象出状态。我们通过下面的例子来看一看,贪心思想是如何帮助动态规划确立状态的。例题一 青蛙的烦恼题目大意:池塘里有n片荷叶(1n1000),它们正好形成一个凸多边形。按照顺时针方向将这n片荷叶顺次编号为1,2,n。有一只小青蛙站在1号荷叶上,它想跳过每片荷叶一次且仅一次(它可以从所站的荷叶跳到任意一片荷叶上)。同时,它又希望跳过的总距离最短。请你编程帮小青蛙设计一条路线。算法分析:问题似乎是一个N个点的TSP问题,但却又是一个特殊的TSP问题题目中说明,N个点围成了一个凸多边形!如何合理的运用这个特殊的条件成为了解题的关键。原始的问题模型很容易使人放弃动态规划,因为状态难以抽象,状态转移

5、也无从着手。但如果从问题特征出发,灵活运用贪心策略,却能巧妙的设计出一种高效的动态规划算法!先介绍一下TSP问题的一种局部搜索算法2-最优算法。它从随机的一种可选路径出发(称为路径T),试图去改善它。我们在T中寻找出2条不相交的边,移动这两条边,如果新产生的路径比原来的路径优秀,那么就移动这两条边。这种移动称为2-交换。如图所示:可以根据这个TSP问题的局部最优算法容易想到,原问题的最短路线中显然不存在相交的边,否则一定可以将这条路线“改进”成一条更优秀的路线。根据上述结论可以知道:从1出发的第一步只能到2或者n,否则产生的路线一定不会是最优的。因此,原问题的模型变成了:寻找以1为起点,遍历凸

6、多边形1.N中的顶点一次且一次的最短路线。根据上述结论可以知道,如果离开1到达2,接下来的任务是寻找以2为起点,遍历凸多边形2.N中的顶点一次且一次的最短路线;如果离开1到达N,接下来的任务是寻找以N为起点,遍历凸多边形2.N中的顶点一次且一次的最短路线。这是一个递归的过程!因此,状态可以这样表示:fi,L,0表示从i出发,遍历i.i+L-1中的顶点一次且一次的最短距离;fi,L,1表示从i+L-1出发,遍历i.i+L-1中的顶点一次且一次的最短距离。状态转移方程是:fi,L,0 = mindist(i,i+1)+fi+1,L-1,0,dist(i,i+L-1)+fi+1,L-1,1fi,L,

7、1 = mindist(i+L-1,i+L-2)+fi,L-1,1,dist(i+L-1,i)+fi,L-1,0fi,1,0 = 0, fi,1,1 = 0其中dist(a,b)表示第a个结点和第b个结点之间的欧几里德距离。问题的答案是f1,n,0时间复杂度O(n2)。本题小结:本题中运用贪心思想合理的分析出了问题最优解的一些特点,从而能够根据问题中的特殊条件确立出动态规划的状态,把看似NP的问题,用动态规划巧妙的解决了。例题二 The Horse Racing 题目大意:中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马(N2000),每场比赛,输的一

8、方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢最多的钱?算法分析:这个问题很显然可以转化成一个二分图最佳匹配的问题。把田忌的马放左边,把齐王的马放右边。田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边;如果平局,则连一条权为0的边;如果输,则连一条权为200的边。然而我们知道,二分图的最佳匹配算法的复杂度很高,无法满足N2000的要求。我们不妨用贪心思想来分析一下问题。因为田忌掌握有比赛的“主动权”,他总是根据齐王所出的马来分配自己的马,所以这里

9、不妨认为齐王的出马顺序是按马的速度从高到低出的。由这样的假设,我们归纳出如下贪心策略: 1、如果田忌剩下的马中最强的马都赢不了齐王剩下的最强的马,那么应该用最差的一匹马去输给齐王最强的马。 2、如果田忌剩下的马中最强的马可以赢齐王剩下的最强的马,那就用这匹马去赢齐王剩下的最强的马。 3、如果田忌剩下的马中最强的马和齐王剩下的最强的马打平的话,可以选择打平或者用最差的马输掉比赛。第一个贪心策略的证明:此时田忌的所有马都赢不了齐王的马,所以无论用最慢马去输还是用最快的马去输都同样是输,而处于贪心的思想,我们应该保留相比之下更强的马,因此用最慢的马去输一定不会比用别的马去输来得劣,所以这是最优策略。

10、证毕。第二个贪心策略的证明:假设现在齐王剩下的最强的马是A,田忌剩下的最强的马是B,如果存在一种更优的比赛策略,让B的对手不是A,而使得田忌赢更多的钱的话,那么设此时A的对手是b,B的对手是a:1、 若bA,则有Ba,bA。这个结果和BA,ba是相同的。2、 若aa,bA。这个结果不如BA,ba来得优秀。3、 若baA,则有Ba,bA。这个结果和BA,ba是相同的。由此可知,交换各自对手后,一定不会使得结果变劣,那么假设是不成立的。证毕。第三个贪心策略的证明:因为田忌最快的马也只是和齐王的马打平,那么田忌只能选择平或输,选择平的话,当然只能用最快的马去平了;选择输的话当时是用最慢的马去输来得值

11、得,这和第一个贪心策略的思路是一样的。证毕。我们发现,第三个贪心策略出现了一个分支:打平或输掉。如果穷举所有的情况,算法的复杂度将比求二分图最佳匹配还要高;如果一概而论的选择让最强的马去打平比赛或者是让最差的马去输掉比赛,则存在反例: 光是打平的话,如果齐王马的速度分别是1 2 3,田忌马的速度也是1 2 3,每次选择打平的话,田忌一分钱也得不到,而如果选择先用速度为1的马输给速度为3的马的话,可以赢得200两黄金。 光是输掉的话,如果齐王马的速度分别是1 3,田忌马的速度分别是2 3,田忌一胜一负,仍然一分钱也拿不到。而如果先用速度为3的马去打平的话,可以赢得200两黄金。虽然因为第三个贪心

12、出现了分支,我们不能直接的按照这种方法来设计出一个完全贪心的方法,但是通过上述的三种贪心策略,我们可以发现,如果齐王的马是按速度排序之后,从高到低被派出的话,田忌一定是将他马按速度排序之后,从两头取马去和齐王的马比赛。有了这个信息之后,动态规划的模型也就出来了!设fi,j表示齐王按从强到弱的顺序出马和田忌进行了i场比赛之后,从“头”取了j匹较强的马,从“尾”取了i-j匹较弱的马,所能够得到的最大盈利。状态转移方程如下:其中gi,j表示田忌的马和齐王的马分别按照由强到弱的顺序排序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得的盈利,胜为200,输为200,平为0。本题小结:虽然本题存在直接贪心

13、的方法,不过它可以作为一个例子告诉大家,合理的运用贪心策略,分析出问题的一些本质之后,一些看似不能用动态规划做的题目便可以巧妙的确立出状态,继而可以用动态规划来求解。3、贪心思想在动态规划中的应用二: 优化算法一些动态规划的题目虽然容易确立出正确的状态以及轻松的写出状态转移方程。但是直序的算法往往效率不高。而贪心历来都是与“高效”一词分不开的。所以,合理的在动态规划中运用贪心思想,能够让原本效率低下的算法获得“重生”!例题三 石子归并题目大意:在一个操场上摆放着一排n(n1000)堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的

14、花费。试编程求出将n堆石子合并成一堆的最小花费。算法分析:这是一道经典的动态规划问题,用mi,j表示第i堆石子合并到第j堆石子所需的最小花费,wi,j表示第i堆石子到第j堆石子的石子总数。状态转移方程如下:上述算法的状态总数为O(n2),每个状态转移的状态数为O(n),每次状态转移的时间为O(1),所以总的时间复杂度为O(n3)。显然,这个简单易懂的算法的过于低效了,我们需要进行优化。我们尝试寻找动态规划中的冗余。不难发现,在枚举决策k的时候,上述算法实在是太盲目了,因为当有一些k如果作为决策点,肯定得不到最优解,我们可以不去枚举他们。这是一种贪心的思想!令si,j表示使得mi,j取到最小时的

15、k。可以用四边形不等式证明出si,jsi,j+1si+1,j+1, ij这说明mi,j的决策单调。于是状态转移方程可以变成如下的形式:整体的时间复杂度则变为了: 本题的相关证明详见参考文献3本题小结:决策单调的动态规划是一类很常见的问题,例如NOI2004的hut就是一道不错的根据决策单调的性质来优化动态规划的题目。根据决策单调的性质,我们避免了一些无用的决策枚举,从而使得算法的复杂度降了级,这是贪心思想的经典体现。例题四 The Lost House题目大意:蜗牛的房子遗失在了一棵树的某个叶子结点上,它要从根结点出发开始寻找它的房子。有一些中间结点可能会住着一些虫子,这些虫子会告诉蜗牛它的房

16、子是否在以这个中间结点为根的子树上,这样蜗牛就不用白跑路了。当然,如果有些结点没有住着虫子的话,那么可怜的蜗牛只有靠自己决定访问顺序来探索了。假设蜗牛走过一条边的耗费都是1,且房子遗失在每个叶子结点的概率都是相等的,那么请问蜗牛找到他的房子的最小数学期望值?我们约定,树上的结点数n最多为1000,每个结点的分叉数k最多为8。例如在下面的这棵树当中:蜗牛从根结点1出发开始寻找它的房子,它的房子可能遗失在2、4、5。在结点3上住着一只虫子,它会告诉蜗牛,以3为根的子树上是否有蜗牛的房子。蜗牛有两种走法。蜗牛可以先访问2,如果它在那儿不能找到房子,那么它要回到根结点1,再通过3来访问结点4(或5),

17、如果还是不能找到它的房子,那么它又要回到结点3,再去访问结点5(或4)。在这种走法中,当房子分别位于2、4、5的时候,蜗牛需要走的步数分别是1、4、6,期望值是(1+4+6)/3=11/3。显然,这种走法没有充分发挥虫子在这里起到的作用。在另一种走法中,蜗牛先访问结点3,它可以从住在3上的虫子那里得知它的房子是否存在于4或5的信息。在这种走法中,当房子分别位于2、4、5的时候,蜗牛需要走的步数分别是3、2、4,期望值是(3+2+4)/3=3。这种走法合理的利用了虫子提供的信息,得到了更优的数学期望值。 算法分析:不难分析出本题的大体模型是用树的动态规划来求解。用Fai表示蜗牛的House在i为

18、根的子树上的期望和,用Fbi表示蜗牛的House不在i为根的子树上的时候遍历该子树需要的时间,用Leavesi 表示i为根的子树上叶子节点的数目。问题的解答就是Fa根结点/Leaves根结点。如果结点u有k个儿子,我们按照S1.Sk进行访问,Fau的计算方式是:Fau = 0; Fbu = 0;for i = 1 to k dobegin Fau = Fau + (Fbu + 1)LeavesSi + FaSi; Fbu = Fbu + FbSi + 2;end;用公式的形式可以表示为: 现在的问题就是如何决定访问儿子的顺序,不同的访问顺序会产生不同的Fau。我们要使得Fau尽量的小。一种直观

19、的方法是k!枚举访问顺序,总体复杂度是O(nk!),实在是很低效。用状态压缩的动态规划进行二次动规的话,可以将复杂度降为O(n2kk),勉强可以接受了。(注:由于状态压缩的动态规划不是本文的重点,故这里不做展开)但是我们的研究并没有因此停止!我们尝试用贪心的思想来分析问题:考虑一种访问顺序中的两个相邻元素v和v+1,如果交换v和v+1之后得到的值不如交换前的值,那么v一定在v+1的前面了。具体证明如下:我们对公式来进行一些处理。可以看出,交换v和v+1之后,对和是不会产生任何影响的,关键是看是增大了还是减小了。把交换前和交换后的值做差:最后得到的则只跟元素v和v+1的信息有关,于别的元素的排列

20、情况无关,所以元素v和v+1是可比的。证毕。另外,根据这个结果,可以得出另一个结论:如果A一定放在B前,B一定放在C前,可以推导出A一定放在C前。证明: 两式相乘得到:证毕。上面这个结论说明,本题中的“可比性”是可以传递的,因此可以根据这个性质确定出一个全序关系,因而省去了枚举排列的部分,只需要对所有元素进行一次排序即可。时间复杂度为O(nklog2k),非常优秀。本题小结:从原始的动态规划模型入手,分析出算法的大体框架,巧妙的运用贪心思想来除去原始算法中的冗余,进而达到优化算法的目的。4、贪心思想在动态规划中的应用总结本文通过四个例题简单的介绍了贪心思想在动态规划中的两种简单应用确立状态和优

21、化算法。贪心思想运用于动态规划时的奇妙之处在于它合理的利用了问题中隐含的一些特殊信息,因而可以使得看似不能动态规划的题目确立出动态规划的状态,或者除去算法中的冗余,提高动态规划的效率。“贪婪的动态规划”并不是一种算法,而是一种思想,要灵活的在动态规划中运用好贪心思想,关键是在于对问题的深入理解和推敲。这要求我们具备“勇于探索”、“大胆创新”、“举一反三”的能力。【感谢】NOI2005浙江代表队全体成员的支持浙江省绍兴县柯桥中学吴建峰老师的技术指导【参考文献】1刘汝佳,黄亮算法艺术与信息学竞赛2(美)Zbigniew Michalewicz David B.Fogel如何解决问题现代启发式方法3

22、IOI2001集训队论文动态规划算法的优化技巧毛子青【附录】参考程序例题二参考程序: 例题四参考程序:例二原题Tian Ji - The Horse RacingDescription Here is a famous story in Chinese history. That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others. Both of Tian and the k

23、ing have three horses in different classes, namely, regular, plus, and super. The rule is to have three rounds in a match; each of the horses must be used in one round. The winner of a single round takes two hundred silver dollars from the loser. Being the most powerful man in the country, the king

24、has so nice horses that in each class his horse is better than Tians. As a result, each time the king takes six hundred silver dollars from Tian. Tian Ji was not happy about that, until he met Sun Bin, one of the most famous generals in Chinese history. Using a little trick due to Sun, Tian Ji broug

25、ht home two hundred silver dollars and such a grace in the next match. It was a rather simple trick. Using his regular class horse race against the super class from the king, they will certainly lose that round. But then his plus beat the kings regular, and his super beat the kings plus. What a simp

26、le trick. And how do you think of Tian Ji, the high ranked official in China? Were Tian Ji lives in nowadays, he will certainly laugh at himself. Even more, were he sitting in the ACM contest right now, he may discover that the horse racing problem can be simply viewed as finding the maximum matchin

27、g in a bipartite graph. Draw Tians horses on one side, and the kings horses on the other. Whenever one of Tians horses can beat one from the king, we draw an edge between them, meaning we wish to establish this pair. Then, the problem of winning as many rounds as possible is just to find the maximum

28、 matching in this graph. If there are ties, the problem becomes more complicated, he needs to assign weights 0, 1, or -1 to all the possible edges, and find a maximum weighted perfect matching. However, the horse racing problem is a very special case of bipartite matching. The graph is decided by th

29、e speed of the horses - a vertex of higher speed always beat a vertex of lower speed. In this case, the weighted bipartite matching algorithm is a too advanced tool to deal with the problem. In this problem, you are asked to write a program to solve this special case of matching problem. Input The i

30、nput consists of up to 50 test cases. Each case starts with a positive integer n ( n=1000) on the first line, which is the number of horses on each side. The next n integers on the second line are the speeds of Tians horses. Then the next n integers on the third line are the speeds of the kings hors

31、es. The input ends with a line that has a single 0 after the last test case. Output For each input case, output a line containing a single number, which is the maximum money Tian Ji will get, in silver dollars. Sample Input 392 83 7195 87 74220 2020 20220 1922 180Sample Output 20000例四原题The Lost HouseDescription One day a snail climbed up to a big tree and finally came to the end of

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1