1、浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 1 页 共 12 页浅谈数形结合思想在信息学竞赛中的应用安徽 周源目录目录 .1摘要 .2关键字 .2引子 .3以形助数 .3例一Raney 引理的证明 .3题意简述 .3分析 .3目标图形化 .3小结 .4例二最大平均值问题(USACO 2003 March Open) .4题意简述 .4分析 .5目标图形化 .5构造下凸折线 .5维护下凸折线 .6最后的优化:利用图形的单调性 .7小结 .7以数助形 .7例三画室(POI oi V Stage I) .8题意简述 .8分析 .8目标数值化 .9动态规划解题 .9小结 .10总结 .10附录
2、 .11关于 2003 年上海市选拔赛题 Sequence .11题意简述 .11分析 .11论文附件 .12参考文献 .12浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 2 页 共 12 页摘要数与形是数学中两个最古老而又最基本的对象,数形结合又是一种重要的数学思想。本文主要以当今信息学奥赛中几道试题为例,从以形助数和以数助形两个侧重点讨论了数形结合思想在信息学竞赛解题中广阔的应用前景。最后文章分析指出数形结合思想的两个重要特性并由此提出“数形结合”重在有机的结合,希望对同学们在实际比赛中灵活的运用数形结合思想有一些帮助。关键字信息学竞赛 数学思想 数形结合思想以数助形 以形助数辩证矛
3、盾 多元性 个体差异性思维、编程、时间、空间复杂度浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 3 页 共 12 页引子数与形是数学中两个最古老而又最基本的对象,数形结合又是一种重要的数学思想。在当今信息学竞赛中,某些纷繁复杂的试题背后,往往蕴含着丰富的几何背景,而计算几何类问题却又需要借助计算机强大的实数运算能力。正如华罗庚先生所说的“数形结合千般好” ,在算法和程序设计中,巧妙地运用数形结合思想,可以顺利的破解问题,化难为易,找到问题的解题思路。数形结合思想常包括以形助数、以数助形两个方面。以形助数正如前文所述,一些试题中繁杂的代数关系身后往往隐藏着丰富的几何背景,而借助背景图形的性
4、质,可以使那些原本复杂的数量关系和抽象的概念,显得直观,从而找到设计算法的捷径。例一Raney 引理的证明题意简述设整数序列 A = Ai, i=1, 2, , N,且部分和 Sk=A1+Ak,序列中所有的数字的和 SN=1。证明:在 A 的 N 个循环表示 1中,有且仅有一个序列 B,满足 B 的任意部分和 Si均大于零。分析先来看一个例子,若有序列 A = ,其 6 个循环表示为1. 2. 3. 4. 5. 6. 其中只有第 4 个序列,部分和为 3, 1, 1, 2, 6, 1,满足成为序列 B 的条件。若要用一般的代数或是组合方法来证明这个有趣的结论,似乎无从下手,但若要想到了用“形”
5、来帮忙,问题就简单多了。目标图形化周期性的推广 A 序列,得到一个无穷序列,便于观察其循环表示,得到:1 先设一个序列是环状的,则从其任意一个字符处断开以后形成的非环序列即为该序列的一个循环表示。浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 4 页 共 12 页同时计算这个序列的部分和 Si,因为这个序列是周期性的,因此对于所有的 k0,均有 Sk+N=Sk+1。如果做出这个函数的图像,则可以说函数有一个“平均斜率”为 :每沿横轴正方向走 N 个单位,函数值就增加 1。于是如下图所1示,可以用两条斜率为 的直线“夹住”函数包含的所有点:图 1 无穷序列的部分和函数图像图示中 N=6,且使
6、用了上文举的例子。注意较低的那条直线,在每连续的N 个单位长度中,它与函数图像有且仅有一个交点,这是因为斜率是 的直线N1在每 N 个单位长度中最多到达一次整数点。这个交点是在这以后的 N 个点中的最低值,因此由此处的后一个位置导出的循环表示的所有部分和均为正数。而同时每连续 N 个单位长度仅有一个交点也证明了解的唯一性。小结一个简单的几何论证就证明了著名的 Raney 引理,其简练是其他方法不能企及的。Raney 引理有很广泛的应用,Catalan 数以及扩展 Catalan 数的组合公式就可以用该引理轻松解决。比如今年上海市选拔赛第二天比赛中的序列(Sequence)以及 OIBH 练习赛
7、中的项链,使用 Raney 引理都是最简单的方法之一。 2用几何图形辅助思考,不只停留在组合计数这一类中,更渗透在算法设计和优化的每一个分支中,近年来流行的“斜率优化”法是另一个很好的例子。例二最大平均值问题(USACO 2003 March Open)题意简述读入一列正数,a 1, a2, , aN,以及一个数 F。定义 ,1),(ijaiavej2 用 Raney 引理解答 Sequence 的过程,详见附录。浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 5 页 共 12 页ij。求 Maxave(a, b), 1a, bN ,且 ab- F+1,即求一段长度大于等于 F 且平均值最
8、大的子串。范围:FN10 5。分析简单的枚举算法可以这样描述:每次枚举一对满足条件的(a, b),即 ab-F+1,检查 ave(a, b),并更新当前最大值。然而这题中 N 很大,N 2 的枚举算法显然不能使用,但是能不能优化一下这个效率不高的算法呢?答案是肯定的。目标图形化首先一定会设序列 ai的部分和: Si=a1+a2+ai, ,特别的定义 S0=0。这样可以很简洁的表示出目标函数 !)1(),(ijSave如果将 S 函数绘在平面直角坐标系内,这就是过点 Sj和点 Si-1 直线的斜率!于是问题转化为:平面上已知 N+1 个点,P i(i, Si),0iN,求横向距离大于等于 F 的
9、任意两点连线的最大斜率。构造下凸折线有序化一下,规定对 ik(Pj, Pk),就很容易可以证明 Pj点是多余的。浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 6 页 共 12 页区 区 区 区 区 区 2区区区1区区区xyPjPiPk图 2若 k(Pt, Pj) k(Pt, Pi),那么可以看出,P t点一定要在直线 PiPj的上方,即阴影所示的 1 号区域。同理若 k(Pt, Pj) k(Pt, Pk),那么 Pt点一定要在直线 PjPk的下方,即阴影所示的 2 号区域。综合上述两种情况,若 PtPj的斜率同时大于 PtPi和 PtPk的,P t点一定要落在两阴影的重叠部分,但这部分显
10、然不满足开始时 tj 的假设。于是,P t落在任何一个合法的位置时,P tPj的斜率要么小于 PtPi,要么小于 PtPk,即不可能成为最大值,因此 Pj点多余,完全可以从检查集合中删去。这个结论告诉我们,任何一个点 Pt的检查集合中,不可能存在一个对最优结果有贡献的上凸点,因此我们可以删去每一个上凸点,剩下的则是一个下凸折线。最后需要在这个下凸折线上找一点与 Pt点构成的直线斜率最大显然这条直线是在与折线相切时斜率最大,如图所示。 yxPt图 3维护下凸折线这一小节中,我们的目标是:用尽可能少的时间得到每一个检查点的下凸浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 7 页 共 12 页
11、折线。算法首先从 PF开始执行:它是检查集合非空的最左边的一个点,集合内仅有一个元素 P0,而这显然满足下凸折线的要求,接着向右不停的检查新的点:PF+1, PF+2, , PN。检查的过程中,维护这个下凸折线:每检查一个新的点 Pt,就可以向折线最右端加入一个新的点 Pt-F,同时新点的加入可能会导致折线右端的一些点变成上凸点,我们用一个类似于构造凸包的过程依次删去这些上凸点,从而保证折线的下凸性。由于每个点仅被加入和删除一次,所以每次维护下凸折线的平摊复杂度为 O(1),即我们用 O(N)的时间得到了每个检查集合的下凸折线。最后的优化:利用图形的单调性最后一个问题就是如何求过 Pt 点,且
12、与折线相切的直线了。一种直接的方法就是二分,每次查找的复杂度是 O(log2N)。但是从图形的性质上很容易得到另一种更简便更迅速的方法:由于折线上过每一个点切线的斜率都是一定的 3,而且根据下凸函数斜率的单调性,如果在检查点 Pt时找到了折线上的已知一个切点 A,那么 A 以前的所有点都可以删除了:过这些点的切线斜率一定小于已知最优解,不会做出更大的贡献了。于是另外保留一个指针不回溯的向后移动以寻找切线斜率即可,平摊复杂度为为 O(1)。至此,此题算法时空复杂度均为 O(N),得到了圆满的解决。小结回顾本题的解题过程,一开始就确立了以平面几何为思考工具的正确路线,很快就发现了检查集合中对最优解
13、有贡献的点构成一个下凸函数这个重要结论,之后借助计算几何中求凸包的方法维护一个下凸折线,最后还利用下凸函数斜率的单调性发现了找切线简单方法。题解围绕平面几何这个中心,以斜率为主线,整个解题过程一气呵成,又避免了令人头晕的代数式变换,堪称以形助数的经典例题。顺便提一下:这种方法在加速决策过程,很多动态规划算法都可以运用本题“斜率优化”的方法提高算法效率。如 IOI 2002 的 batch 和 BOI 2003 的 euro等。至于这类题目的共同特点,还是很值得研究的,但不在本文讨论范围内,因而不再讨论,但欢迎有兴趣的同学以后和我交流。以数助形古希腊的毕达哥拉斯认为“万物皆数” ,的确,数是反映
14、事物本质特征的最好方法之一。数学发展史上,正是在解析几何创立之后,人们才对各种繁杂的曲线有了更深入的了解。如今信息时代中,计算机处理各类事物,最终无不是归结于二进制数的基本运算,数的重要性可见一斑。在当今信息学竞赛中,一些试题给出的描述中图形极为复杂,容易使选手陷入“迷魂阵” ,在这种情况下,以数助形,一举抓住其本质特征,不失为解题的一种好方法。3 由于折线没有连续性,因此更准确的应该说,过每一个点切线斜率的范围都一定的。浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 8 页 共 12 页例三画室(POI oi V Stage I)题意简述定义尺寸为 0 的方阵为一个 1*1 的矩阵,在其
15、唯一的一个方格中有一个小孔。对于 i0,递归的定义尺寸为 i 的方阵如下图所示:图 4给定方阵的尺寸 N,以及另外两个参数 X 和 Y。准备两个尺寸为 N 的方阵,一个叠放在另一个上面,再将上面的方阵向右移动 X 列,同时向上移动 Y 行。如此操作之后,求两个方阵有多少个公共的孔。如右上图,尺寸为 2 的方阵,向右平移 2 列,向上平移 2 行。则两个方阵有 3 个公共小孔。范围:N 100。分析直接分析两个方阵相交后的情况是可行的,我曾经看过一些集训队前辈的解题报告,都是这么分析的,但是方法很繁,思考量很大。下图是某解题报告中的一个说明附图,报告中先标出两个方阵的相交区域,再分情况讨论。显然
16、可以看出,直接从“形”来分析本题,路子是很坎坷的。图 5浅谈数形结合思想在信息学竞赛中的应用 安徽 周源第 9 页 共 12 页目标数值化我们不如换至和“形”相对的另一面“数”来思考,按照下图所示的 x, y方向为每行每列从 0 开始编号,最大至 2N-1,于是每一个方格都有唯一的坐标(x, y)。图 6下面来研究一下在什么条件下,一个方格 P(x, y)内有小孔。由于方阵是二分递归定义的,于是我们很自然联想到将 x 和 y 化为二进制。设 x 和 y 的二进制表示分别为:a1a2a3aN 和 b1b2b3bN来看两个数的第 1 位,a 1 和 b1,如下图,它们一共有 4 种取值方法,其分布
17、分别对应着递归定义中的左上、左下、右上、右下四块区域。显然当 a1=0 且b1=1 时无论以后各位取什么数,P 点内都不会有小孔:因为其已经落在了左上无孔区。否则可以同理讨论两个数的第 2 位,第 3 位图 7 示意(a 1, b1)的取值分布情况得到的结论是,当且仅当不存在 1iN,满足 ai=0 且 bi=1 时,方格 P 内有小孔。不妨称这个为方格的有孔性质。动态规划解题后面的问题就非常简单了,题目要找的无非是这样的有序数对(x, y )的个数:0x, y,x+ X, y+Y2 N-1,且(x, y) ,(x+X, y +Y)的二进制表示都满足有孔性质称这个为方格的有公共孔性质。浅谈数形
18、结合思想在信息学竞赛中的应用 安徽 周源第 10 页 共 12 页我们可以采用动态规划的方法:首先将 X, Y 也都转化成二进制形式:p1p2p3pN 和 q1q2q3qN以位数为阶段,通过记录进位情况保证无后效性:f( i, k1, k2)表示第 i 位至第N 位部分满足有公共孔性质的有序对总数,且要满足这一部分有序对的坐标和对应部分的 X, Y 相加进位分别是 k1 和 k2:显然 0k1, k2 1。动态规划的状态转移是非常简单的,但描述比较复杂:每一次转移需要约(22)2=16 次运算,因此不再赘述,有兴趣的读者可以查看附件中的程序。最后说明一下,题目所要的答案就是 f(1, 0, 0
19、)。算法若不算上高精度,时间复杂度为 O(N),若使用循环数组,空间上仅需要常数个高精度数组 4,而且实现程序也极为简单,包括高精度也不过 100 多行。对比从“形”上得出的算法, “数”的优越性是不言而喻的。小结回顾解题过程,当分析发现两方阵相交情况较复杂,不宜讨论时,我们决定避开“形”的正面冲突,而从“数”这方面下手,很快便取得了令人满意的效果:方格的有孔性质和有公共孔性质使题目的要求显得简单了许多。到此就可以套用经典的动态规划算法了。可以说本题是一个较好的例子,但类似以数助形的例题似乎比较罕见。事实上,正如前文所述,一般的计算机都是以数为基础的,同学们在写各类程序的时候,最终还是要归结到
20、“数”来实现,对数的重要作用多少有些熟视无睹了。而从上例又可以看出,如果试题加以适当的“误导” ,选手们背离“数”的捷径,南辕北辙也不是没有可能的。因此,在遇到如同上例的题目时,面对多元化的复杂图形,化形归数,往往是抓住题目要害的好方法。总结数与形是现实世界中客观事物的抽象和反映,是数学的基石,也是信息学竞赛命题涉及的两个主要方面。数形结合是一种古老的数学思想,新兴的信息学奥林匹克竞赛又赋予她新的活力。上文举了三个实例,大体上来说,都巧妙的运用了数形结合思想。但从细节上分析,它们之间仍略有差异。其一,三者从两个不同的侧重点阐述了数形结合思想的内涵,即以形助数和以数助形。但在实际问题中,数和形决
21、没有明确的界限,数形结合思想也并不仅仅局限于文中提出的两个方面。更多的情况下,数与形互相促进、互相包含,在一定条件下互相转化,可以用“数形互助”一词来形容。这,体现了数形的辩证矛盾关系和数形结合思想的多元性。其二,用“形”来解例题二,似乎是唯一的出路,但在例一和例三中,并不是仅仅能用文中提到的方法解题,其他精彩解法我也略知一二。但相比而言,巧妙的使用数形结合思想会大大降低思考和编程复杂度,为我们在短短的竞赛时间中迅速解题开辟了一条便捷的道路。需要指出的是,不同的人有不同的知识结构,比赛经验等,他们对某一算法难度系数的感觉也是不同的。因而对同一题而言,不同的人可能会选择不同的4 直接用“形”的方法做出的程序,空间复杂度是 O(N)的,而且程序很长,详见附录。