贪婪的动态规划.docx

上传人:b****8 文档编号:23998901 上传时间:2023-05-23 格式:DOCX 页数:18 大小:132.17KB
下载 相关 举报
贪婪的动态规划.docx_第1页
第1页 / 共18页
贪婪的动态规划.docx_第2页
第2页 / 共18页
贪婪的动态规划.docx_第3页
第3页 / 共18页
贪婪的动态规划.docx_第4页
第4页 / 共18页
贪婪的动态规划.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

贪婪的动态规划.docx

《贪婪的动态规划.docx》由会员分享,可在线阅读,更多相关《贪婪的动态规划.docx(18页珍藏版)》请在冰豆网上搜索。

贪婪的动态规划.docx

贪婪的动态规划

贪婪的动态规划

——浅谈贪心思想在动态规划中的应用

浙江省绍兴县柯桥中学黄劲松

 

【关键字】

贪心法,动态规划,状态,时间复杂度

【摘要】

贪心法和动态规划是信息学竞赛中的两种常用算法,本文着重讨论了贪心的思想是如何巧妙的运用到动态规划的解题中的。

全文分三个部分,首先讨论了贪心思想运用到动态规划解题中的可行性和必要性,然后就贪心思想在动态规划中的两种基本应用分别做了举例说明,最后总结全文。

【正文】

引言

贪心法和动态规划是信息学竞赛中的常用经典算法,而当某些问题的模型过于复杂的时候,由于状态过于庞大、转移困难等一系列的问题,常规的动态规划难于甚至无从下手。

而在这个时候,巧妙的使用贪心思想,将其融入到动态规划的解题中,动态规划便焕发出了新的光彩。

1、贪心思想运用到动态规划中的必要性和可行性

动态规划的原理是:

在求解问题的过程中,通过处理位于当前位置和所达目标之间的中间点来找到整个问题的解。

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

适合于动态规划法的标准问题必须具有下列特点:

●1、整个问题的求解可以划分为若干个阶段的一系列决策过程。

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

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

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

●5、各阶段状态之间的转换有明确定义的费用

在实际的动态规划的解题中,面临着两大困难:

一是不知道题目是否可以用动态规划求解;二是即使能够想到用动态规划来求解,但是因为种种因素,算法的效率并不乐观。

这个时候,使用贪心思想分析问题,可以让你在山穷水尽疑无路的时候,柳暗花明又一村。

在运用贪心思想的时候,主要是分析出问题的一些本质,或者分析出低效算法的一些冗余。

当然,我们要根据题目的特殊信息,合理的运用好贪心思想,才能帮助动态规划发挥其强大的功效。

下文就贪心思想如何解决动态规划面临着的这两大困难分别做了举例说明。

2、贪心思想在动态规划中的应用一:

确立状态

动态规划当中,状态的确立是重点,而在实际的解题过程中,状态的信息往往是隐含的,这个时候,合理的运用贪心思想,可以迅速的从繁芜丛杂的问题背景中巧妙地抽象出状态。

我们通过下面的例子来看一看,贪心思想是如何帮助动态规划确立状态的。

例题一青蛙的烦恼

题目大意:

池塘里有n片荷叶(1≤n≤1000),它们正好形成一个凸多边形。

按照顺时针方向将这n片荷叶顺次编号为1,2,…,n。

有一只小青蛙站在1号荷叶上,它想跳过每片荷叶一次且仅一次(它可以从所站的荷叶跳到任意一片荷叶上)。

同时,它又希望跳过的总距离最短。

请你编程帮小青蛙设计一条路线。

算法分析:

问题似乎是一个N个点的TSP问题,但却又是一个特殊的TSP问题——题目中说明,N个点围成了一个凸多边形!

如何合理的运用这个特殊的条件成为了解题的关键。

原始的问题模型很容易使人放弃动态规划,因为状态难以抽象,状态转移也无从着手。

但如果从问题特征出发,灵活运用贪心策略,却能巧妙的设计出一种高效的动态规划算法!

先介绍一下TSP问题的一种局部搜索算法——2-最优算法。

它从随机的一种可选路径出发(称为路径T),试图去改善它。

我们在T中寻找出2条不相交的边,移动这两条边,如果新产生的路径比原来的路径优秀,那么就移动这两条边。

这种移动称为2-交换。

如图所示:

可以根据这个TSP问题的局部最优算法容易想到,原问题的最短路线中显然不存在相交的边,否则一定可以将这条路线“改进”成一条更优秀的路线。

根据上述结论可以知道:

从1出发的第一步只能到2或者n,否则产生的路线一定不会是最优的。

因此,原问题的模型变成了:

寻找以1为起点,遍历凸多边形{1..N}中的顶点一次且一次的最短路线。

根据上述结论可以知道,如果离开1到达2,接下来的任务是寻找以2为起点,遍历凸多边形{2..N}中的顶点一次且一次的最短路线;如果离开1到达N,接下来的任务是寻找以N为起点,遍历凸多边形{2..N}中的顶点一次且一次的最短路线。

这是一个递归的过程!

因此,状态可以这样表示:

f[i,L,0]表示从i出发,遍历{i..i+L-1}中的顶点一次且一次的最短距离;f[i,L,1]表示从i+L-1出发,遍历{i..i+L-1}中的顶点一次且一次的最短距离。

状态转移方程是:

f[i,L,0]=min{dist(i,i+1)+f[i+1,L-1,0],dist(i,i+L-1)+f[i+1,L-1,1]}

f[i,L,1]=min{dist(i+L-1,i+L-2)+f[i,L-1,1],dist(i+L-1,i)+f[i,L-1,0]}

f[i,1,0]=0,f[i,1,1]=0

其中dist(a,b)表示第a个结点和第b个结点之间的欧几里德距离。

问题的答案是f[1,n,0]

时间复杂度O(n2)。

本题小结:

本题中运用贪心思想合理的分析出了问题最优解的一些特点,从而能够根据问题中的特殊条件确立出动态规划的状态,把看似NP的问题,用动态规划巧妙的解决了。

例题二TheHorseRacing

题目大意:

中国古代的历史故事“田忌赛马”是为大家所熟知的。

话说齐王和田忌又要赛马了,他们各派出N匹马(N≤2000),每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。

现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。

请问田忌该如何安排自己的马去对抗齐王的马,才能赢最多的钱?

算法分析:

这个问题很显然可以转化成一个二分图最佳匹配的问题。

把田忌的马放左边,把齐王的马放右边。

田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边;如果平局,则连一条权为0的边;如果输,则连一条权为-200的边。

然而我们知道,二分图的最佳匹配算法的复杂度很高,无法满足N=2000的要求。

我们不妨用贪心思想来分析一下问题。

因为田忌掌握有比赛的“主动权”,他总是根据齐王所出的马来分配自己的马,所以这里不妨认为齐王的出马顺序是按马的速度从高到低出的。

由这样的假设,我们归纳出如下贪心策略:

Ø1、如果田忌剩下的马中最强的马都赢不了齐王剩下的最强的马,那么应该用最差的一匹马去输给齐王最强的马。

Ø2、如果田忌剩下的马中最强的马可以赢齐王剩下的最强的马,那就用这匹马去赢齐王剩下的最强的马。

Ø3、如果田忌剩下的马中最强的马和齐王剩下的最强的马打平的话,可以选择打平或者用最差的马输掉比赛。

第一个贪心策略的证明:

此时田忌的所有马都赢不了齐王的马,所以无论用最慢马去输还是用最快的马去输都同样是输,而处于贪心的思想,我们应该保留相比之下更强的马,因此用最慢的马去输一定不会比用别的马去输来得劣,所以这是最优策略。

证毕。

第二个贪心策略的证明:

假设现在齐王剩下的最强的马是A,田忌剩下的最强的马是B,如果存在一种更优的比赛策略,让B的对手不是A,而使得田忌赢更多的钱的话,那么设此时A的对手是b,B的对手是a:

1、若b>A,则有B>a,b>A。

这个结果和B>A,b>a是相同的。

2、若aa,b≤A。

这个结果不如B>A,b>a来得优秀。

3、若b≤a≤A,则有B>a,b≤A。

这个结果和B>A,b≤a是相同的。

由此可知,交换各自对手后,一定不会使得结果变劣,那么假设是不成立的。

证毕。

第三个贪心策略的证明:

因为田忌最快的马也只是和齐王的马打平,那么田忌只能选择平或输,选择平的话,当然只能用最快的马去平了;选择输的话当时是用最慢的马去输来得值得,这和第一个贪心策略的思路是一样的。

证毕。

我们发现,第三个贪心策略出现了一个分支:

打平或输掉。

如果穷举所有的情况,算法的复杂度将比求二分图最佳匹配还要高;如果一概而论的选择让最强的马去打平比赛或者是让最差的马去输掉比赛,则存在反例:

✓光是打平的话,如果齐王马的速度分别是123,田忌马的速度也是123,每次选择打平的话,田忌一分钱也得不到,而如果选择先用速度为1的马输给速度为3的马的话,可以赢得200两黄金。

✓光是输掉的话,如果齐王马的速度分别是13,田忌马的速度分别是23,田忌一胜一负,仍然一分钱也拿不到。

而如果先用速度为3的马去打平的话,可以赢得200两黄金。

虽然因为第三个贪心出现了分支,我们不能直接的按照这种方法来设计出一个完全贪心的方法,但是通过上述的三种贪心策略,我们可以发现,如果齐王的马是按速度排序之后,从高到低被派出的话,田忌一定是将他马按速度排序之后,从两头取马去和齐王的马比赛。

有了这个信息之后,动态规划的模型也就出来了!

设f[i,j]表示齐王按从强到弱的顺序出马和田忌进行了i场比赛之后,从“头”取了j匹较强的马,从“尾”取了i-j匹较弱的马,所能够得到的最大盈利。

状态转移方程如下:

其中g[i,j]表示田忌的马和齐王的马分别按照由强到弱的顺序排序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得的盈利,胜为200,输为-200,平为0。

本题小结:

虽然本题存在直接贪心的方法,不过它可以作为一个例子告诉大家,合理的运用贪心策略,分析出问题的一些本质之后,一些看似不能用动态规划做的题目便可以巧妙的确立出状态,继而可以用动态规划来求解。

3、贪心思想在动态规划中的应用二:

优化算法

一些动态规划的题目虽然容易确立出正确的状态以及轻松的写出状态转移方程。

但是直序的算法往往效率不高。

而贪心历来都是与“高效”一词分不开的。

所以,合理的在动态规划中运用贪心思想,能够让原本效率低下的算法获得“重生”!

例题三石子归并

题目大意:

在一个操场上摆放着一排n(n≤1000)堆石子。

现要将石子有次序地合并成一堆。

规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的花费。

试编程求出将n堆石子合并成一堆的最小花费。

算法分析:

这是一道经典的动态规划问题,用m[i,j]表示第i堆石子合并到第j堆石子所需的最小花费,w[i,j]表示第i堆石子到第j堆石子的石子总数。

状态转移方程如下:

上述算法的状态总数为O(n2),每个状态转移的状态数为O(n),每次状态转移的时间为O

(1),所以总的时间复杂度为O(n3)。

显然,这个简单易懂的算法的过于低效了,我们需要进行优化。

我们尝试寻找动态规划中的冗余。

不难发现,在枚举决策k的时候,上述算法实在是太盲目了,因为当有一些k如果作为决策点,肯定得不到最优解,我们可以不去枚举他们。

这是一种贪心的思想!

令s[i,j]表示使得m[i,j]取到最小时的k。

可以用四边形不等式证明出

s[i,j]≤s[i,j+1]≤s[i+1,j+1],i≤j

这说明m[i,j]的决策单调。

于是状态转移方程可以变成如下的形式:

整体的时间复杂度则变为了:

本题的相关证明详见参考文献[3]

本题小结:

决策单调的动态规划是一类很常见的问题,例如NOI2004的hut就是一道不错的根据决策单调的性质来优化动态规划的题目。

根据决策单调的性质,我们避免了一些无用的决策枚举,从而使得算法的复杂度降了级,这是贪心思想的经典体现。

例题四TheLostHouse

题目大意:

蜗牛的房子遗失在了一棵树的某个叶子结点上,它要从根结点出发开始寻找它的房子。

有一些中间结点可能会住着一些虫子,这些虫子会告诉蜗牛它的房子是否在以这个中间结点为根的子树上,这样蜗牛就不用白跑路了。

当然,如果有些结点没有住着虫子的话,那么可怜的蜗牛只有靠自己决定访问顺序来探索了。

假设蜗牛走过一条边的耗费都是1,且房子遗失在每个叶子结点的概率都是相等的,那么请问蜗牛找到他的房子的最小数学期望值?

我们约定,树上的结点数n最多为1000,每个结点的分叉数k最多为8。

例如在下面的这棵树当中:

蜗牛从根结点1出发开始寻找它的房子,它的房子可能遗失在2、4、5。

在结点3上住着一只虫子,它会告诉蜗牛,以3为根的子树上是否有蜗牛的房子。

蜗牛有两种走法。

蜗牛可以先访问2,如果它在那儿不能找到房子,那么它要回到根结点1,再通过3来访问结点4(或5),如果还是不能找到它的房子,那么它又要回到结点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。

这种走法合理的利用了虫子提供的信息,得到了更优的数学期望值。

算法分析:

不难分析出本题的大体模型是用树的动态规划来求解。

用Fa[i]表示蜗牛的House在i为根的子树上的期望和,用Fb[i]表示蜗牛的House不在i为根的子树上的时候遍历该子树需要的时间,用Leaves[i]表示i为根的子树上叶子节点的数目。

问题的解答就是Fa[根结点]/Leaves[根结点]。

如果结点u有k个儿子,我们按照S[1]..S[k]进行访问,Fa[u]的计算方式是:

Fa[u]=0;Fb[u]=0;

fori=1tokdo

begin

Fa[u]=Fa[u]+(Fb[u]+1)×Leaves[S[i]]+Fa[S[i]];

Fb[u]=Fb[u]+Fb[S[i]]+2;

end;

用公式的形式可以表示为:

现在的问题就是如何决定访问儿子的顺序,不同的访问顺序会产生不同的Fa[u]。

我们要使得Fa[u]尽量的小。

一种直观的方法是k!

枚举访问顺序,总体复杂度是O(nk!

),实在是很低效。

用状态压缩的动态规划进行二次动规的话,可以将复杂度降为O(n2kk),勉强可以接受了。

(注:

由于状态压缩的动态规划不是本文的重点,故这里不做展开)

但是我们的研究并没有因此停止!

我们尝试用贪心的思想来分析问题:

考虑一种访问顺序中的两个相邻元素v和v+1,如果交换v和v+1之后得到的值不如交换前的值,那么v一定在v+1的前面了。

具体证明如下:

我们对公式①来进行一些处理。

可以看出,交换v和v+1之后,对

是不会产生任何影响的,关键是看

是增大了还是减小了。

把交换前和交换后的值做差:

最后得到的

则只跟元素v和v+1的信息有关,于别的元素的排列情况无关,所以元素v和v+1是可比的。

证毕。

另外,根据这个结果,可以得出另一个结论:

如果A一定放在B前,B一定放在C前,可以推导出A一定放在C前。

证明:

两式相乘得到:

证毕。

上面这个结论说明,本题中的“可比性”是可以传递的,因此可以根据这个性质确定出一个全序关系,因而省去了枚举排列的部分,只需要对所有元素进行一次排序即可。

时间复杂度为O(nklog2k),非常优秀。

本题小结:

从原始的动态规划模型入手,分析出算法的大体框架,巧妙的运用贪心思想来除去原始算法中的冗余,进而达到优化算法的目的。

4、贪心思想在动态规划中的应用总结

本文通过四个例题简单的介绍了贪心思想在动态规划中的两种简单应用——确立状态和优化算法。

贪心思想运用于动态规划时的奇妙之处在于它合理的利用了问题中隐含的一些特殊信息,因而可以使得看似不能动态规划的题目确立出动态规划的状态,或者除去算法中的冗余,提高动态规划的效率。

“贪婪的动态规划”并不是一种算法,而是一种思想,要灵活的在动态规划中运用好贪心思想,关键是在于对问题的深入理解和推敲。

这要求我们具备“勇于探索”、“大胆创新”、“举一反三”的能力。

 

【感谢】

NOI2005浙江代表队全体成员的支持

浙江省绍兴县柯桥中学吴建峰老师的技术指导

【参考文献】

[1]刘汝佳,黄亮《算法艺术与信息学竞赛》

[2](美)ZbigniewMichalewiczDavidB.Fogel《如何解决问题——现代启发式方法》

[3]IOI2001集训队论文——《动态规划算法的优化技巧》毛子青

【附录】

[参考程序]

[例题二]参考程序:

[例题四]参考程序:

[例二原题]

TianJi--TheHorseRacing

Description

HereisafamousstoryinChinesehistory.

Thatwasabout2300yearsago.GeneralTianJiwasahighofficialinthecountryQi.Helikestoplayhorseracingwiththekingandothers.

BothofTianandthekinghavethreehorsesindifferentclasses,namely,regular,plus,andsuper.Theruleistohavethreeroundsinamatch;eachofthehorsesmustbeusedinoneround.Thewinnerofasingleroundtakestwohundredsilverdollarsfromtheloser.

Beingthemostpowerfulmaninthecountry,thekinghassonicehorsesthatineachclasshishorseisbetterthanTian's.Asaresult,eachtimethekingtakessixhundredsilverdollarsfromTian.

TianJiwasnothappyaboutthat,untilhemetSunBin,oneofthemostfamousgeneralsinChinesehistory.UsingalittletrickduetoSun,TianJibroughthometwohundredsilverdollarsandsuchagraceinthenextmatch.

Itwasarathersimpletrick.Usinghisregularclasshorseraceagainstthesuperclassfromtheking,theywillcertainlylosethatround.Butthenhisplusbeattheking'sregular,andhissuperbeattheking'splus.Whatasimpletrick.AndhowdoyouthinkofTianJi,thehighrankedofficialinChina?

WereTianJilivesinnowadays,hewillcertainlylaughathimself.Evenmore,werehesittingintheACMcontestrightnow,hemaydiscoverthatthehorseracingproblemcanbesimplyviewedasfindingthemaximummatchinginabipartitegraph.DrawTian'shorsesononeside,andtheking'shorsesontheother.WheneveroneofTian'shorsescanbeatonefromtheking,wedrawanedgebetweenthem,meaningwewishtoestablishthispair.Then,theproblemofwinningasmanyroundsaspossibleisjusttofindthemaximummatchinginthisgraph.Ifthereareties,theproblembecomesmorecomplicated,heneedstoassignweights0,1,or-1toallthepossibleedges,andfindamaximumweightedperfectmatching...

However,thehorseracingproblemisaveryspecialcaseofbipartitematching.Thegraphisdecidedbythespeedofthehorses--avertexofhigherspeedalwaysbeatavertexoflowerspeed.Inthiscase,theweightedbipartitematchingalgorithmisatooadvancedtooltodealwiththeproblem.

Inthisproblem,youareaskedtowriteaprogramtosolvethisspecialcaseofmatchingproblem.

Input

Theinputconsistsofupto50testcases.Eachcasestartswithapositiveintegern(n<=1000)onthefirstline,whichisthenumberofhorsesoneachside.ThenextnintegersonthesecondlinearethespeedsofTian'shorses.Thenthenextnintegersonthethirdlinearethespeedsoftheking'shorses.Theinputendswithalinethathasasingle`0'afterthelasttestcase.

Output

Foreachinputcase,outputalinecontainingasinglenumber,whichisthemaximummoneyTianJiwillget,insilverdollars.

SampleInput

3

928371

958774

2

2020

2020

2

2019

2218

0

SampleOutput

200

0

0

[例四原题]

TheLostHouse

Description

Onedayasnailclimbeduptoabigtreeandfinallycametotheendof

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

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

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