贪心归纳

贪心是一种在每次决策时采取当前意义下最优策略的算法。因此使用贪心法要求问题的整体最优性可以有局部最优性导出。贪心的正确性需要证明凭感觉,下面列举几种证明手段:

1.微扰(邻项交换)
证明在任意局面下,任何对局部最优策略的微小改变都会造成整体结果变差。经常用于以“排序”为贪心策略的证明。

2.范围缩放
证明任何对局部最优策略作用范围的扩展都不会造成整体结果变差。

3.决策包容性
证明在任意局面下,做出局部最优决策以后,在问题空间中的可达集合包含了做出其他任何决策后的可达集合。换言之,这个局部最优策略提供的可能性包含其他所有策略提供的可能性。

4.反证法

5.数学归纳法

6.直觉

————《算法竞赛》

然而看了这些总结性的东西我还是一脸懵逼


------------
所以总结了一些经典题目

项目选择问题

n个人m各项目,其中每个人都有一个可以选择的项目区间,问怎样分配,能使项目完成的最多。poj 3614

把每个人的项目区间按区间右端点从小到大排序,对于每个人,遍历他的项目区间选择,最小的项目。

那么为什么这样是正确的呢,想想,对于这个人的项目区间的任意两个项目,x,y。x对应的区间下标小于y对应的区间下标。后面的人,只可能出现,1.x,y都可以做,2.x,y都不能做,3.y能做,x不能做。所以取x对结果毫无影响。

灵活的问题转化

有时以直接的思路不好想出贪心策略,而把问题转化一下贪心策略就十分显然了。
luogu 1209 luogu 1007 luogu 2242

就luogu1209为例,题目中要用一定数量的木板覆盖一些漏洞,求木板总共的长度和,这样贪心策略不好想,问题转化一下,改为一开始有一块木板刚好覆盖所有漏洞,再切下一定长的木板,求木板总共的长度和,这样的话,贪心策略就很显然了,每次切最长的,留下就是最短的。

排队接水问题

可能很多人都认为这是个水题,但是,我想说的是:她确实很水,但是证明的思路,却是个典例,试着交换两人的位置,算出对答案的影响,然后以某个顺序排下序。这是个常用的贪心方法。

开车加油问题

也是一种很典型的问题,一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1 、汽车油箱的容量 C (以升为单位)、每升汽油能行驶的距离 D2 、出发点每升汽油价格 P 和沿途油站数 N ( N 可以为零),油站 ii离出发点的距离 Di 、每升汽油价格 Pi ( i=1,2,…,N )。一开始写的是DPluogu 1016

~~这也许就是我说的看直觉的贪心~~,如果从一个加油站可以到达一个费用比他小的加油站,那就加正好此加油站到第一个费用比他小的加油站的油然后跳到那个加油站,如果没有费用比他小的,那就加满,到下一个加油站,如果加满油你也到不了下一个加油站,你就GG了,其实这个贪心策略想想还是很有道理的,甚至有点显然。

双方式完成任务的问题

完成一个目标,有两种方式,问如何最快完成条件。luogu 1095

一般是一个有消耗的大招可以完成很多进度要消耗时间回蓝,然后一个小招无消耗,先用平均速度快的(一般是大招),然后不用再攒一个大招的时候,再比较一下,小招和大招的效率。

负载平衡问题(中位数)

也是一种典型的题
当初先做的网络流24题,然后做了一个叫分金币的题,然后看了一眼数据比24题大2000倍自信掏出网络流然后T飞了...

这里发现贪心题也要数学证明
设第i个小朋友分给第i-1个小朋友的糖果数为Pi(注意, Pi可正可负, 负数理解成为第i-1个小朋友分给第i个小朋友-Pi个糖果),P1为第一个小朋友分给第n个小朋友的, 显然最后的答案就是要求|P1|+|P2|+..+|Pn|的最小值.

而我们的最总目的是,将pi全部用p1表示。

设ave为最终每个人拿到的糖果数目,也就是平均数。

则ave=p[i+1]-p[i]+a[i] //p[i]是他分给i-1的,p[i+1]是i+1分给他的。

再设 w[i]=ave-a[i] 则变成 w[i]=p[i+1]-p[i];

设s[i]=w[1]+w[2]+…+w[i] 则pi=p1+s[i-1]

|P1|+|P2|+..+|Pn|=|p1|+|p1+s[1]|+..+|P1+s[n-1]|

设Q=-p1

则 原式变为|0-Q|+|s[1]-Q|+..+|s[n-1]-Q|

这个式子可以看成 求 0,s[1],s[2]…s[n-1]到 Q的 最短距离之和,

这个数列的中位数就是Q值

反正我是证不出来

删数问题

也是一个水题,提供一个思路,判断当前操作对结果的影响(合不合理)合理再操作(废话)

区间放点(区间套点)

给定n个区间,放最少的点,求使得每一个区间内至少有一个点的点的最小数量。
按照区间左端点从小到大排序,对于左边第一个没有点的区间,在区间的右端点放一个点,一直重复,因为是最左边的区间内一定要放一个点,既然要放,为什么不尽量放在更多的区间里面呢?,因为区间是按左端点排过序的,所以放在右端点上,使其尽量放在更多区间里。区间套点,就是给N个点,使所有点都在至少一个长度为L的区间中,问区间的最小值,两个问题思路差不多。(此证明方法官方称为“决策包容性”)。

智力大冲浪

也是技巧题,从最后一天往前考虑,这样,决策集合就是单调递增的了,贪心测略就变得显而易见。这个策略非常常见。

未完待续

猜你喜欢

转载自www.cnblogs.com/Xu-daxia/p/9361107.html
今日推荐