组合数学在程序设计中的应用课件_第1页
组合数学在程序设计中的应用课件_第2页
组合数学在程序设计中的应用课件_第3页
组合数学在程序设计中的应用课件_第4页
组合数学在程序设计中的应用课件_第5页
已阅读5页,还剩11页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

组合数学在程序设计中的应用长沙市第一中学曹利国组合数学在程序设计中的应用长沙市第一中学1

程序设计一直与数学联系得非常的紧密,特别是像组合数学这一分支,与程序设计有着千丝万缕的联系。对于某些题目,我们用正常的做法想法也许无从下手,但是如果我们把题目的全局或者局部与组合数学联系起来,或许就会“柳暗花明又一村”——找到了一种特别独特,特别有效率的数学方法,把无从下手的棘手题变得简单易行。这就是组合数学在程序中的运用。下面使用几个实例说明组合数学在程序中的运用。引言程序设计一直与数学联系得非常的紧密,特别是像组合数学2Catalan数定义:一个凸n边形通过不相交于n边形内部的对角线把n边形拆分成若干三角形的不同拆分数。Catalan数定义:一个凸n边形通过不相交于n边形内部的对3分析

设Cn表示凸n边形的拆分方案总数。由题目中的要求可知一个凸n边形的任意一条边都必然是一个三角形的一条边,边P1Pn也不例外,再根据“不在同一直线上的三点可以确定一个三角形”,只要在P2,P3,……,Pn-1点中找一个点Pk(1<k<n),与P1、Pn共同构成一个三角形的三个顶点,就将n边形分成了三个不相交的部分(如图3所示),我们分别称之为区域①、区域②、区域③,其中区域③必定是一个三角形,区域①是一个凸k边形,区域②是一个凸n-k+1边形,区域①的拆分方案总数是Ck,区域②的拆分方案数为Cn-k+1,故包含△P1PkPn的n边形的拆分方案数为CkCn-k+1种,而Pk可以是P2,P3,……,Pn-1种任一点,根据加法原理,凸n边形的三角拆分方案总数为,同时考虑到计算的方便,约定边界条件C2=1P1Pn①②③图4P2P3PkPn--1分析

设Cn表示凸n边形的拆分方案总数。由题目中的要求可知一4=C(2n,n)/(n+1)具体实现时,若直接用上述公式计算,对数字的精度要求较高。可将其化为递归式再进行递推计算,并且注意类型的定义要用comp型。

5n个+1,n个-1构成2n项a1,a2,a3,a4,,,,,,a2n

其部分和满足

a1+a2+......ak(k=1,2,3,...2n)>=0的数列个数。n个+1,n个-1构成2n项6序列a1a2..ak的元素顺序保持不变,按不同结合方式插入合法圆括号对的方案数。

n=4

(a((bc)d))

(a(b(cd)))

((ab)(cd))

(((ab)c)d)

((a(bc))d)序列a1a2..ak的元素顺序保持不变,按不同结合方式插入合7一个操作数序列,从1,2,一直到n,栈A的深度大于n。现在可以进行两种操作:1.

将一个数,从操作数列的头端移至栈的头端(对应栈的push操作)2.

将一个数,从栈的头端移至输出序列的尾端(对应栈的pop操作)。使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下表为由123生成序列231的过程。步骤0123456操作数序列1232333

栈

1211311

输出序列

2223231你的程序将对给定的n,计算并输出由操作数序列1,2,……,n经过操作可能得到的输出序列总数。一栈(Noip2003普及组第三题)一个操作数序列,从1,2,一直到n,栈A的深度大于n。现在可8结合定义我们很容易能发现:如果进栈看成1,出栈看成0,在任何一位上累计的“0”的个数不大于累计的“1”的个数,因为必须在栈里有数的情况下才能向外弹数。原题转化为——n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,“0”的累计数不大于“1”的累计数,求满足条件的数有多少。结合定义我们很容易能发现:如果进栈看成1,出栈看成0,在任何9二Littlerooks(SGU222)将k个车摆在n*n的棋盘上,使得任何两个车不能互相攻击(车可以横着或竖着走无限格,不能走斜线)

二Littlerooks(SGU10算法描述组合数学:排列与组合由于题目里的棋子是“车”而不是“后”,所以一个棋子不会影响到与其不同行或与其不同列的棋子。结合n皇后问题的方案表示法,我们很容易想到排列组合。排列的定义:设A={a1,a2,a3……an}是n个不同元素的集合,r满足0<=r<=n。任取A中r个元素按顺序排成一列,称为从A中取r个的一个排列。组合的定义:当从n个元素中取出r个而不考虑它的顺序时,称为从n中取r的组合。算法描述组合数学:排列与组合由于题目里的棋子是“车”11根据鸽巢原理n>=k,先从简单的情况下手:n=k。此时的公式非常简单:P(n,k)。主要就是对于n>k的情况时的处理。因为每一列最多只能放一颗棋子,所以我们首先把没有棋子的列去掉,再合并成一个n*k的棋盘,结合刚才的数据结构我们能很快知道在这个新棋盘上摆k个棋子还是P(n,k)种方案,再把去掉的(n-k+1)列插入摆棋子的k行中,插入方案总数易得为C(n,k)种。根据乘法原理,总方案数为C(n,k)*P(n,k)种。这样一来程序实现起来就方便多了。根据鸽巢原理n>=k,先从简单的情况下手:n=k。此时的公式12错排问题:n个数,分别为1~n,排成一个长度为n的排列。若每一个数的位置都与数的本身不相等,则称这个排列是一个错排。例如,n=3,则错排有231、312。编写程序,求n的错排个数。三错排问题(经典问题)三错排问题(经典问题)13组合数学:递推我们设k个元素的错位全排列的个数记做:W(k)。四个元素的错位排列W(4)我们用穷举法可以找到如下9个:(4,3,2,1)(3,4,1,2)(2,1,4,3)

(4,1,2,3)(3,4,2,1)(3,1,4,2)

(4,3,1,2)(2,4,1,3)(2,3,4,1)它们有什么规律呢?组合数学:递推我们设k个元素的错位全排列的个数记做:W(k)14通过反复的试验,我们发现事实上有两种方式产生错位排列:

A.将k与(1,2,…,k-1)的某一个数互换,其他k-2个数进行错排,这样可以得到(k-1)×W(k-2)个错位排列。

B.另一部分是将前k-1个元素的每一个错位排列(有W(k-1)个)中的每一个数与k互换,这样可以得到剩下的(k-1)×W(k-1)个错位排列。根据加法原理,我们得到求错位排列的递推公式W(k):W(k)=(k–1)*[W(k–1)+W(k–2)]通过反复的试验,我们发现事实上有两种方式产生错位排列:

A.15结论其实视野看得发散一些,扩展一些,能融入程序设计的知识点不仅限于组合数学,还有拓扑学,微积分,计算几何……甚至是物理,化学。这样跨学科的融合相信能给信息学计算机这门学科焕发新的光彩。从上述题我们能发现一个共同特点,也就是将组合数学融入题目中,简单而又快

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论