- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一.利用数学思想直接找出解的一般规律 有些问题,如果直接用动态规划或是图论的方法来解决效率可能会并不理想;这时,我们首先应该想到的是优化,而如果优化无法达到预期的效果,那我们只有重新寻找算法了。于是,我们就试图找出问题的一般规律、或是该问题所用到的一个小问题的一般规律,这样,时间效率将会大大提高。 我们首先来看一个直接找出原问题的一般规律的例子—— 例题一 最优分解方案 把正整数N分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大。 [输入] 只有一行,包括数N(3=N=1000)。 [输出] 第一行输出最优分解方案,相邻两数之间用单个空格隔隔开;第二行输出最大的乘积。 二.利用数学模型化繁为简。 能够对原题导出数学结论无疑是最直接地运用了数学思想,而在很多情况下,往往没有那么简单。在有些实际应用中,我们需要将原来的实际问题抽象成数学模型,然后加以解决。而在某些程序设计竞赛的试题中,建立数学模型也需要一定的技巧,需要运用一定的数学思想。 下面,我们来考虑一个利用数学思想“建模”的例子—— 例题二 三角形灯塔 有一个N行(0N=50)的三角形灯塔,它的第1行有1个灯,第2行有2个灯,…,第N行有N个灯。我们用(I,j)表示从上至下第i行,从左至右第j个灯。 每个灯有明、暗两种状态,第i行(1=IN)的任一个灯(I,j)的状态由下一行的两个灯(I+1,j)和(I+1,j+1)的状态决定(1=j=I)。具体的规则为:当且仅当两个灯(I+1,j)和(I+1,j+1)的状态不同时,灯(I,j)为亮。 请你编一个程序,从已知的P(P=0)个灯的状态出发,推出最底一行N个灯的所有可能的状态总数。 三. 通过数学分析化未知为已知。 有些构造性地问题本身就是由数学问题衍生而来,但正因为问题的“构造性”,使这类问题的解法让人捉摸不透,很难想到。在这种情况下,我们可以试着先从数学的角度分析问题,若能得出对问题直接有益的结论则是最好,如果不能,我们也可以从分析问题的过程中启发思维,从而巧妙地构造算法。 下面来看一个具体的例子体会一下数学分析对解题的帮助—— 例题三 配锁问题 某机要部门安装了电子锁。M个工作人员每人发一张磁卡,卡上有开锁的密码特征。为了确保安全,规定至少要有N个人同时使用各自的磁卡才能将锁打开,并且任意N个人在一起都能将锁打开。现在需要你计算一下,电子锁上至少要有多少种特征,每个人的磁卡上至少有几个特征。如果特征的编号用从1开始的自然数表示,将每个人的磁卡的特征编号打印出来。要求输出的电子锁的总特征数最少。 为了使问题简单,规定: 3=M=7,1=N=4,N=M 四.利用数学结论优化算法。 在上面的例题中,我们清晰地看到:数学思想的 火花孕育了解题的算法。综合上面的三个例题,数学方法、思想的巧妙使用,破解了一个个难题。最后,我们将通过一个并不难的搜索题,通过优化前和优化后算法时间效率的比较,来体会一下数学在优化算法方面的应用。 例题四 骨牌覆盖问题 对于任意一个m*n的矩阵,求L形骨牌覆盖后所剩方格数最少的一个方案。 下图为L形骨牌的八种形态: * * 数学和计算机原本就是密不可分的学科。有许多计算机编程问题如果不利用数学思想则很难甚至无法达到预期的效果。 有些问题,利用这座桥可以更方便地往返于河两岸,而还有一些问题,如果不利用这座桥,可能根本无法到达河对岸。 如果把问题和编程实现看成是河的两岸,那么数学思想就是连接河两岸的一座桥梁,有了这座桥,从河的一岸到另一岸便不再是件难事了。 也就是说,有些问题利用数学思想可以走捷径(例如NOI2002的“荒岛野人”),而还有一些问题,如果不利用数学思想,就根本无法解决(例如NOI2002的“机器人M号”)。今天,我们将从四个方面探讨利用数学思想提高算法效率,简化问题的例子: 初看本题,发觉很显然可以用动态规划解决,但我们并不满足——直觉告诉我们,应该可以找到最优分解方案的一般规律,而一旦找到,时间效率将大大提高。 我们的直觉告诉我们,将N分解成的m个数应尽量接近,而且m应该尽量得大。 更一般地说,就是把N写成连续自然数2,3,…,k之和(当然,由于自然数1不影响乘积,自然不将
文档评论(0)