算法合集之《浅析倍增思想在信息学竞赛中的应用》.doc

算法合集之《浅析倍增思想在信息学竞赛中的应用》.doc

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法合集之《浅析倍增思想在信息学竞赛中的应用》

浅析倍增思想在信息学竞赛中的应用 安徽省芜湖市第一中学 朱晨光 目 录 摘要 2 关键字 2 正文 2 引言 2 应用之一 在变化规则相同的情况下加速状态转移 2 应用之二 加速区间操作 8 一个有趣的探讨 11 总结 12 感谢 12 参考文献 13 附录 13 摘要 倍增思想是解决信息学问题的一种独特而巧妙的思想。本文就倍增思想在信息学竞赛中两个方面的应用进行了分析。全文可以分为五个部分: 第一部分引言,简要阐述了倍增思想的重要作用以及运用方法; 第二部分介绍倍增思想的第一个应用——在变化规则相同的情况下加速状态转移; 第三部分介绍倍增思想的第二个应用——加速对区间进行的操作; 第四部分探讨了一个有趣的问题,即为什么倍增思想每次只将考虑范围扩大一倍而不是两倍、三倍等; 第五部分总结全文,再次指出倍增思想的重要性以及应该怎样灵活运用倍增思想。 关键字 倍增思想 变化规则 状态转移 区间操作 正文 引言 倍增思想是一种十分巧妙的思想,在当今的信息学竞赛中应用得十分广泛。尽管倍增思想可以应用在许多不同的场合,但总的来说,它的本质是:每次根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作。大家所熟悉的归并排序实际上就是倍增思想的一个经典应用。 在解决信息学问题方面,倍增思想主要有这两个方面的应用—— 在变化规则相同的情况下加速状态转移; 加速区间操作。 下文将就这两个方面进行详细的讨论。 倍增思想应用之一 在变化规则相同的情况下加速状态转移 首先,让我们来看一个简单的例子——已知实数a,计算a17。 分析: 很显然,一种最简单的方法就是令b=a,然后重复16次进行操作b=b*a.这样,为了得到a17,共进行了16次乘法。 现在考虑另外一种方法,令a0=a,a1=a2,a2=a4,a3=a8,a4=a16,可以看出,ai=ai-12,(1=i=4)。于是,得到a0,a1,a2,a3,a4共需要4次乘法。而a17= a*a16=a0*a4, 也就是说,再进行一次乘法就可以得到a17.这样,总共进行5次乘法就算出了a17. 如果将这种方法推而广之,就可以解决这样一个一般性的例题: 已知,计算: 分析: 将n表示成为二进制形式并提取出其中的非零位,即n=2b1+2b2+……+2bw,不妨设b1b2……bw. 由于已知,所以也就知道了,重复bw次将这个数平方并记录下来,就可以得到(bw+1)个数:,,,……,; 根据幂运算的法则,可以推出==**……*,而这些数都已经被求出,所以最多再进行(bw+1)次操作就可以得到。 由于n的二进制表示最多有个非零位,所以bw最大为。也就是说,最多进行O()次乘法就可以算出,这比进行O(n)次乘法效率高得多。 当然,由于得到n的二进制表示的过程本身就是按照从低位到高位的顺序,所以并不需要记录,,,……,,只需要每次即算即用就可以了。伪代码如下(见下页): 那么,这个算法是如何减少乘法次数的呢?显然,==**……*使得求转化为求不超过个a的幂的积。而序列,,,……,中除了第一个数以外,每一个数都是前一个数的平方。即在从得到的过程中,按照原始的方法需要进行2i次乘法操作,而现在只需要利用已知结果进行一次乘法操作(*=)即可。大大减少了操作次数,从而降低了时间复杂度。 而在实际情况中,a可能是一个实数,也可能是一个矩阵或是一个抽象的状态。变化规则也可能是其他操作(如矩阵乘法、动态规划的状态转移等)。但是只要符合以下两个条件,就可以应用倍增思想并采用类似于上面的方法加速计算: 每次的变化规则必须相同; 变化规则必须满足结合律。 具体到上面的例子,每次的变化规则都是乘法,而乘法是满足结合律的。 下面将通过另一个例子更加深入地探讨倍增思想在加速状态转移方面的应用,同时得到更精确的定义。 例2、骰子的运动 给定一个六个面的骰子,每个面上都有一定的权值(1到50之间的整数)。骰子运动的范围是一个宽度为4,向左右无限延伸的带子(如图1.1)。带子从左到右的横坐标值为……,-3,-2,-1,0,1,2,3,……,从前到后的纵坐标值依次为1,2,3,4(这里的坐标对应的都是格子,而不是点)。这样,带子被分成了无限多个格子。每个格子恰好能与骰子的一个面完全重合。骰子每次可以向前后左右中的一个方向移动一格(但不能移出带子),花费是移动后朝上的面所附带的权值。 给定当前骰子位置的坐标与各个面的朝向,求将这个骰子移动到某个新位置所需的最小花费。(所给横坐标的绝对值小于等于109)。 分析: 如果不考虑横坐标巨大的差值,本题完全可以用动态规划求解。方法是将每一格按照骰子的朝向拆分成24种状态,然后按列进行动态规划(本质上是一个分层图)得到最小花费。具体方法是从第一列24*4=96个状态推到第二列96个

文档评论(0)

9885fp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档