版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、归纳与贪心,第一部分,贪心方法,贪心方法的基本思想,贪心是一种解题策略,也是一种解题思想 使用贪心方法需要注意局部最优与全局最优的关系,选择当前状态的局部最优并不一定能推导出问题的全局最优 利用贪心策略解题,需要解决两个问题: 该题是否适合于用贪心策略求解 如何选择贪心标准,以得到问题的最优解,适用于贪心策略求解的问题的特点,适用于贪心策略求解的问题必须具有最优子结构的性质,但并不是所有具有最优子结构的问题都可以用贪心策略求解。因为贪心往往是盲目的,需要使用更理性的方法动态规划(例如“0-1背包问题”与“部分背包问题”),贪心方法的应用,例题1:节点网络。 现有一个N!个节点的网络,每个节点的
2、编号都是编号(A1A2A3AN)序列的一个置换。对于任意两个节点S和T,如果T的编号是由S编号的首位与除首位外的编号中任一位交换所得 ,则S和T之间有一条边,求从给定节点S走到节点(A1A2A3AN)所需经过的最少边数。其中,n100。,贪心方法的应用,例如n=3的情况:,贪心方法的应用,【分析】从题意表面上看,本题是一个求最短路径的问题,但题设中的N100,也就是说图中最多有100!个节点,采用二维关系的图结构根本无法存贮这众多的状态。通过问题的本质分析,可以将问题转化为一个序列的最优转化问题。,贪心方法的应用,采用贪心策略: 每次让一个节点归位或为下一步工作做准备。 其具体步骤为: 若序列
3、中第一个点为Ax (x1),则将第一个点和第x个点交换。这便完成了让一个点归位的工作; 若第一个是A1,则任找一个编号与位置不相符的点,并与之交换。这样下一步便可让交换到1号位置的点归位。,贪心方法的应用,一共经过4步完成。,下面看一个n=4,初始序列为(A3A4A1A2)的推演过程:,贪心方法的应用,例题2:d-规则问题。 对任意给定的m(mN+)和n(nN+),满足m1,使得KaP,则修改P为:P=P-y|y=sa,sN+ ,并称该d规则具有分值a。现要求编制一个程序,对输入的m,n值,构造相应的初始集合P,对P每应用一次d规则就累加其相应的分值,求能得到最大累加分值的d规则序列,输出每次
4、使用d规则时的分值和集合p的变化过程。,贪心方法的应用,【分析】 初看这一问题,很容易想到用贪心策略来求解,即选择集合中最大的可以删除的数开始删起,直到不能再删除为止,而且通过一些简单的例子来验证,这一贪心标准似乎也是正确的,例如,当m=3,n=10时,集合P3,10,运用上述“贪心标准”可以得到这一问题的正确的最优解d=54312,即其d-规则过程如下: 1. a=5 P=3,4,6,7,8,9 d=5 2. a=4 P=3,6,7,9d=5+4=9 3. a=3 p=7 d=5+4+3=12,贪心方法的应用,但是,如果再仔细地分析一个例子,当m=3,n18时,如果还是使用上述“贪心标准”,
5、则得到问题的d-规则总分为d=35,其d-规则序列为(9,8,7,6,5),而实际上可以得到最大d-规则总分为d38,其对应的d-规则序列为(9,8,7,6,3,5)。 为什么会出现这样的反例呢?这是因为,问题中要使得d-规则总分d值越大,不光是要求每一个d分值越大越好,也要求取得的d分值越多越好。 因此,本题不能采用纯粹的贪心策略求解。,贪心方法的应用,【改进】 将原算法基础上进行改进。下面给出新的算法: 建立集合P=m.n 从n div 2到m每数构造一个集合ci,包含该数在P中的所有倍数(不包括i本身) 从n div 2起找到第一个元素个数最少但又不为空的集合ci 在d分值中加上i 把i
6、及ci集合从P集中删除,更新所有构造集合的元素 检查所有构造集合,若还有非空集合,则继续3步骤,否则打印、结束,贪心方法的应用,下面看m=3, n=18时的推演过程: 初始P=3.18 找到i=9, ci=18, P=3.8,10.17 找到i=8, ci=16, P=3.7,10.15,17 找到i=7, ci=14, P=3.6,10.13,15,17 找到i=6, ci=12, P=3.5,10,11,13,15,17 找到i=3, ci=15, P=4,5,10,11,13,17 找到i=5, ci=10, P=4,11,13,17 到此所有构造集合全部为空,d=9+8+7+6+3+5
7、=38,贪心方法的应用,讨论: 能否证明此贪心策略是正确的? 能否找到其他更好的算法?,贪心方法的应用,例题3:射击竞赛 射击的目标是一个由RC(2RC1000)个小方格组成的矩形网格。每一列恰有2个白色的小方格和R-2个黑色的小方格。行从顶至底编号为1R,列从左至右编号为1C。射击者可射击C次。 在连续的C次射击中,若每列恰好有一个白色的方格被射中,且不存在无白色方格被射中的行,这样的射击才是正确的。 如果存在正确的射击方法,则要求找到它。,贪心方法的应用,射击的选择有2C种,符合要求的却很少。要解决问题,还需从正确的射击方法的特征入手。,贪心方法的应用,【方法一】网络流算法 我们将表示列的
8、点编号为1到C,表示行的点编号为C+1到C+R,如果一个白色方格处在第i行第j列,那么从点j向点C+i连一条弧,弧的容量为1。再增设一个源点S,从点S往点1到C间各连一条弧,弧的容量为1,又设一个汇点T,从点C+1到点C+R向汇点T连一条弧,弧的容量为1,那么从源点S到汇点T求最大流,求出的最大流量即为最多可以射击到的行数。各条流的路线则描述了具体的射击方案。 可以看出,如果用网络流求出的最大流量比R小,则问题无解,否则我们可以先根据网络流的结果求出该二分图的具体匹配方案。,贪心方法的应用,红色的连线流量为1 蓝色的连线流量为0 选择的射击格即为: (1,3), (2,1), (3,2), (
9、4,4),贪心方法的应用,网络流算法经过优化,时间复杂度可以达到O(C(n+4C+4R) 上述网络流算法虽然可以通过全部数据,但编程复杂度很高,而且极易出错,一不小心就会因为一个小错误影响整个程序。,贪心方法的应用,【方法二】贪心方法 统计所有行包含的白格数 从还没有射击格的行中选出一个白格数最少的 检查所选的行 若所选行的白格数为0,则输出无解; 否则从所选行的白格中任选一个作为射击格,并将与该格同列的另一个白格所处行的白格数减1 返回到第2步,直到所有的行都有射击格。 若还有列没有选射击格,则在该列任选一白格作为射击格即可,贪心方法的应用,上面的贪心方法非常高效: 时间复杂度为O(RC),
10、如果在程序中使用堆优化,时间复杂度将降为O(Rlog2C)。空间复杂度是线性的,而且非常容易实现。 现在关键的问题就是如何证明它的正确性?,贪心方法的应用,【证明】 用hi表示第i行的白格数。如果最开始的时候: minhi=0: 第i行已经没有办法找到可作为射击格的白格,那么问题只能无解。 minhi=1: 那么第i行的这一个白格必须要作为射击格,否则将因第i行没有射击格而造成问题无解。 minhi2: 那么在这一行任选一个白格,顶多只会造成剩余行中有一行h值为1,再处理那一行,最多也只会再造成剩余行中有一行h值为1,如此往复,将保持h值为1的行数不超过1行,最后最坏的情况也是造成最后一行的h
11、值为1,继续下去所有行就都已选取了射击格了。 因此,如果原问题有解,该贪心方法一定能找到一种正确的方案。 由此可以证明,此贪心方法是正确的。,贪心方法的应用,例题4:Transversal 有一个(2n+1)(2n+1)的矩阵,每个单元格中有符号“+”或“-”。 定义一种取反操作:将1至2n+1这2n+1个整数任意排列,得到序列A1,A2,A2n+1,然后将(1,A1),(2,A2),(2n+1,A2n+1)这2n+1个单元格中的符号取反。 求一种操作组合,使得在完成求得的操作组合后,表中“+”的个数不超过2n个。(n20),贪心方法的应用,一种操作组合: (1,1), (2,2), (3,3
12、), (1,2), (2,3), (3,1), (1,1), (2,3), (3,2), (1,3), (2,1), (3,2), 红色符号为上一次取反操作后的结果,仅剩一个“+”。,贪心方法的应用,讨论: 是否可以用贪心法解决此题?,贪心方法的推广,贪心与其它算法结合 搜索的最优化剪枝(NOI99 生日蛋糕) 优化动态规划(HNOI99 Peter的快餐店) 贪心方法与解题策略 最优方法不一定是最好方法(新俄罗斯方块) 想不到最优解法就用较优解法,贪心与其它算法结合,例题5:Peter的快餐店(贪心与动态规划) Peter最近在R市新开了一家快餐店。 该快餐店准备推出一种套餐,每套由A个汉堡
13、、B个薯条和C个饮料组成。为了提高产量,Peter引进了N条生产线。所有生产线都可以生产汉堡、薯条和饮料,由于每条生产线一天能工作的时间是有限的、不同的,而汉堡、薯条和饮料的单位生产时间又不同,Peter需要知道,怎样安排才能是一天中生产的套餐量最大。假设一天中汉堡、薯条和饮料的产量均不超过100个,且生产线总数小于等于10。,贪心与其它算法结合,【分析】用p1、p2、p3分别表示汉堡、薯条和饮料的单位生产时间,ti表示第i条生产线每天的生产时间,pi,j,k表示用前i条生产线生产j个汉堡、k个薯条的情况下,最多能生产的饮料数,ri,j,k表示用第i条生产线生产j个汉堡、k个薯条的情况下,最多
14、能生产的饮料数,则 pi,j,k=maxpi-1,j1,k1+ri,j-j1,k-k1 (j-j1)p1+(k-k1)p2ti) 通过对该算法的时间复杂度分析,最坏的情况下时间复杂度将达到109,是相当费时的。,贪心与其它算法结合,现在加入贪心方法,用贪心方法作预处理 : 首先计算出一天生产套数的上限值:min100 div A,100 div B,100 div C 接着,用贪心方法计算出这N条生产线可以生产的套数,并与上限比较,大于或等于则输出上限值并退出,否则再调用动态规划。因为贪心方法的代价很低,这里甚至可以使用多次贪心标准不同的贪心方法,取其最大值。 在运行动态规划的过程中,也可以每
15、完成一阶段工作便与上限值进行比较,将贪心思想充分融入到动态规划过程中,这样以来,便可望在动态规划完成前提前结束程序。,贪心方法与解题策略,例题6:新俄罗斯方块 新俄罗斯方块的基本规则与传统的有不同: 容纳基块的容器高度没有限制 玩家可以自己选择使用哪一种基块(与传统的俄罗斯方块一样,共有19种,每种都由4个小方块构成,包括了所有变化) 选取摆放的位置不能使得摆放后任意小方格悬空或超过两边的界限 最后的任务是使得所有列上的小方格数都为0,贪心方法与解题策略,【解法】 这道题使用的贪心方法非常简单: 给每种基块打一个分(下表面越宽的分值越高),每次找到能恰好填补最低处又符合规则的分值最高的方块填上
16、即可。 题目的要求恰好允许用贪心方法实现,因为题目没有要求用最少的步骤数,只规定了一个步数范围。,贪心方法与解题策略,虽然这道题已知的最优方法是分治法,而且这种贪心策略还没有办法证明其正确性。但在竞赛中,贪心方法实现简单,又能达到一定的正确率,因而不失为一种好方法。 尤其是在以拿分为目的的竞赛中,作为一种解题策略,贪心方法是很有意义的。,贪心方法与解题策略,近年来,近似算法的题目越来越多,比如: 并行计算(NOI98) 输入一个由+,-,*,/,(,),变量(大写字母)组成的四则运算表达式,输出一段指令,控制有两个运算器的并行计算机在尽量短的时间内正确计算表达式的值。程序的得分将取决于其所能找
17、到的最优解与标准答案相比较的优劣程度。,贪心方法作为一种较优算法,在这种类型的题目中是不容忽视的。,贪心方法小结,贪心作为一种解题思路,虽然有时无法证明它的正确性,但在无法找到其他算法的时候,不失为一种好方法。并且,贪心与其他算法的结合,可以对其他算法起到优化作用。,第二部分,归纳策略,归纳法的基本思想,归纳法的基本思想是通过列举少量的特殊情况,经过分析,最后找出一般的关系。从本质上讲,归纳就是通过观察一些简单而特殊的情况,最后总结出有用的结论或解决问题的有效途径。,归纳法解题的过程,细心的观察; 丰富的联想; 继续尝试; 总结归纳出结论。,归纳法解题的过程,归纳是种抽象,即从特殊现象中找出一
18、般关系。由于在归纳的过程中不可能对所有的可能情况进行枚举,因而最后得到的结论还只是一种猜测(即归纳假设)。所以,严格说来对于归纳假设还必须加以严格的证明。,归纳策略解题应注意的问题:,从问题的简单具体状态分析入手,目的是去寻求可以推广的一般性规律,因此应考虑简单状态与一般性状态之间的联系。 从简单状态中分析出来的规律特征应能够被验证是正确的,不能想当然或任意地提出猜想,否则归纳出来的结论是错误的,必然导致整个问题的解是错解。,归纳策略的应用,例题1: 求前n个自然数的平方之和: S=12+22+32+n2,归纳策略的应用,【分析】这本是一道很简单的题目,但如果能找出S值与n的关系,则此题将更进
19、一步得到简化,由数学证明得知: (12+22+32+n2)/(1+2+3+n) =(2n+1)/3 又由于 1+2+3+n=n(n+1)/2,因此得到: 12+22+32+n2=n(n+1) (2n+1)/6 但这只是通过总结归纳而得到的一种猜测,是否正确还需证明,对归纳假设的证明通常采用数学归纳法(证略)。,归纳策略的应用,例题2:若干个正整数之和为n,其中:n2000,试求它们乘积的最大值以及该最大值的位数k。,归纳策略的应用,【分析】根据数学规律可知,若要使和固定的数的乘积最大,必须使这些数尽可能的多为3,于是可推得以下规律: 当N mod 31 时,N可分解为一个4和若干个3的和; 当
20、N mod 32 时,N 可分解为一个2和若干个3的和; 当N mod 30 时,N 直接分解为若干个3的和。 按照这一分解方法,所有因数的乘积必定最大。 注意:因N 的最大值可达2000,乘积将超过长整型数据范围,所以需用高精度运算。,归纳策略的应用,例题3:极值问题(最高时限15s) 已知m、n为整数,且满足下列两个条件: m、n1,2,K,(1K109) (n 2mnm2)21 编一程序,由键盘输入K,求一组满足上述两个条件的m、n,并且使m2n2的值最大。例如,若K1995,则m987,n1597,则m、n满足条件,且可使m2n2的值最大。,归纳策略的应用,【分析】方法一 从初等数学的
21、角度考虑: 由条件(n 2mnm2)21得出: n 2mnm2 + 1 = 0 n 2mnm21 = 0 根据求根公式 N1,2(m1,2)/2 n3,4(m1,2)/2 其中: 1sqrt(5*m24); 2sqrt(5*m24);,归纳策略的应用,【分析】再考虑条件。由于n1,因此排除了n3和n4存在的可能性. 又由于n和m是整数,因此1和2应为整数。 由于m2n2单调递增,从mk出发,按递减方向将m值代入n的求根公式。 只要1(或2)为整数、n1(或n2)为整数且小于k,则得出的一组m和n一定使 m2n2的值最大。,【算法描述】 mk; while mi do begin 求1 if 1
22、为整数 then begin 求n1; if (n1为整数) and (n1k) Then begin 输出m和n1;halt; end end; then 求2; if 2为整数 then begin 求n2; if(n2为整数)and(n2k) then begin 输出m和n2; halt; end end;then mml; end;while,归纳策略的应用,上述算法从数学意义上来说,是一定可以出得出正确解的。但是该算法疏漏了一个重要条件 1k109 。如果K值超过105,上述算法不可能在限定的15秒内出解。,归纳策略的应用,【分析】方法二 分析小数据会发现:m,n是Fibonacc
23、i数列的相邻两项。 因为: (n 2mnm2)2 1 故: ( m2 + mn n 2 )2 1 又: m 2mnn2(mn)2mn2n2 (mn)2(mn)nn2 故: (m2mnn2)2(mn)2(mn)nn22 即: (n2mnm2)2(mn)2(mn)nn22,归纳策略的应用,【分析】由上述数学变换式可以得出,如果m和n为一组满足条件和条件的解,设nmn,m n那么n,m 也是一组满足条件和条件的一组解。 将所有满足条件和条件的m和n 按递增顺序排成一个Fibomacci数列 1,1,2,3,5,8, 数列中小于k的最大两个相邻数即为试题所要求的一组m和n。 算法:利用Fibomacci数列顺推m,n,求出在条件范围内的m,n最大值,此时m2n2的值最大。,归纳策略的应用,例题4:“王”棋子遍历问题。 题目大意:在nn格(2n=20)棋盘上的任一格子中放置一个棋子,棋子每次只能往其上、下、左、右相邻方格移动一步,求一种遍历方法,使得棋子走n2-1步遍历整个棋盘,每
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024办公楼零星维修项目建设项目施工合同
- 农村合作信用社贷款合同
- 2024没有借条、合同的借贷关系案例
- 工程承包合同模板简化版
- 校园学生安全保障协议书样本
- 超值供货合同模板汇编
- 个人二手房买卖合同范本简单2024年
- 工程经纪合同样本
- 加工食品采购协议
- 2024个人借款合同范本(标准版)
- 二年级排球教案
- 2024二十届三中全会知识竞赛题库及答案
- 预防接种工作规范(2023年版)解读课件
- 医院检验外包服务项目招标文件
- 档案整理及数字化服务方案
- 正高级会计师答辩面试资料
- 道路桥涵工程施工方案(完整版)
- 人教版八年级地理(上册)期中试卷及答案(完整)
- 园林绿化工程施工及验收规范(完整版)
- 光伏冬季施工方案(1)(完整版)
- 60万吨MTO装置中交发言稿
评论
0/150
提交评论