- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用改进算法的思想解决规模维数增大的问题
广东韶关一中 张伟达
【关键字】 增大规模 改进算法 降维 分析 构造
【摘要】
我们常常会遇到一些特殊的问题,它们把我们能够解决的问题改了一改,增加了一维,或者增加了一个因素,从1到2或者是从2到3,本文把它们统称规模维数增大的问题。
解决这类问题可以用改进算法的思想:本文第一部分先是概述这种思想;第二部分则从一道有趣的IQ题目说起,引入改进算法的基本思路和基本途径;第三部分则用多个例子解释说明如何改进算法;最后一部分是总结改进算法的思想。
【目录】
一、概述 2
二、引子:从一道IQ题说起 2
三、改进算法的途径 3
(1)直接增加算法的规模,解决问题 3
【例一】街道问题及其扩展。(经典问题) 3
(2)用枚举处理增加的规模,从而解决问题 4
【例二】旅行(广东省奥林匹克竞赛2001) 4
【例三】炮兵阵地。(NOI2001) 5
(3)用贪心解决增加的规模,从而解决问题 5
【例四】求网络的最小费用最大流。(经典问题) 5
(4)多种途径的综合运用 6
【例五】Team Selection (Balkan OI 2004 Day1) 6
四、总结 9
【感谢】 9
【参考文献】 10
【附录】 11
A.旅行(广东省奥林匹克竞赛2001) 11
B.炮兵阵地(NOI2001) 12
C.Team Selection (BalkanOI 2004 Day 1 Task 2) 13
一、概述
每个学习信息学奥林匹克的选手总是要先学习一些基本的算法,然后才能把算法应用到题目当中去。但是,题目形式多种多样,这些算法往往是不能够直接套用的。有的时候我们分析到某个问题好像可以用某种方法解决,但是这个问题却与之前见过的问题有些不同,例如本文所讨论的情况:问题的规模维数比原问题大,一维的变二维的,二维的变三维的,等等。我们不妨把这类问题叫做规模维数增大的问题,解决这一类问题,往往需要观察问题的特殊性,改进原有算法,从而解决实际问题。
二、引子:从一道IQ题说起
【IQ题题目】在走入正题之前,还是让我们来玩一道IQ题(据说是IBM公司招聘面试用过的题目):有两根分布不均匀的香,每根香烧完的时间是一个小时,你能用什么方法来确定一段5分钟的时间?);
改进算法(改进的过程中,往往不是依靠算法改进算法本身,反而是利用算法的内涵、实质,结合问题,构造算法);
解决问题(我们得出了正确的解法)。
但是如何来改进原有的算法呢,笔者认为可以有以下途径:
直接增加算法的规模,解决问题
用枚举处理增加的规模,从而解决问题
用贪心解决增加的规模,从而解决问题
以上各个途径的综合运用
围绕这一主线,笔者将用例题做进一步的阐明。
三、改进算法的途径
(1)直接增加算法的规模,解决问题
解决简单的问题,常常可以采用直接处理的方法,但是很多时候还是需要一些技巧。
【例一】街道问题及其扩展。(经典问题)
【题目大意】〖原题〗在右图中找出从左下角到右上角的最短路径,每步只能向右方或上方走。〖扩展〗在地图中找出从左下角到右上角的两条路径,两条路径中的任何一条边都不能重叠,并且要求两条路径的总长度最短。
【问题分析】原题是一道简单而又典型的动态规划题,很显然,可以用这样的动态规划方程解题:(这里Distance表示相邻两点间的边长)
但是对于扩展后的题目:再用这种简单的方法就不太好办了。如果非得套用这种方法的话,则最优指标函数就需要有四维的下标,并且难以处理两条路径“不能重叠”的问题。
我们来分析一下原方法的实质:按照图中的斜线来划分阶段,即阶段变量k表示走过的步数,而状态变量xk表示当前处于这一阶段上的哪一点。这时的模型实际上已经转化成了一个特殊的多段图。用决策变量uk=0表示向右走,uk=1表示向上走,则状态转移方程为:(这里的row是地图竖直方向的行数)。通过这一步观察,我们就会发现这个问题很好解决,只需要加一维状态变量就成了。即用分别表示两条路径走到阶段k时所处的位置,相应的,决策变量也增加一维,用分别表示两条路径的行走方向。状态转移时将两条路径分别考虑:
【小结】从这个例子可以看出,改进的时候不能只依靠原始算法,还要分析原始算法的本质。
(2)用枚举处理增加的规模,从而解决问题
【例二】旅行(广东省奥林匹克竞赛2001)
【题目大意】给出一个N×M的数字矩阵,要求这个矩阵的一个子矩阵,并要求这个子矩阵的数字和最大。
【问题分析】初一看题目,想到枚举每一个子矩阵,求出子矩阵的和,比较得出最大值。这样,时间复杂度达到O(N4),显然不可以接受。因为它是两维的问题,我们可以尝试着把维数降低。
先看一维时候的情况:在数列ai中找出和最大的一段。
对于一维的子问题,可以这样来想:如果用最基本的方法,可以枚举每个子序列。但是如果纯
文档评论(0)