第二章:数学基础(组合计数+递推)

第二章:数学基础

介绍:

  算法竞赛鄙视数学竞赛,但它是一门离不开数学的竞赛。它涉及组合数学,数论,概率论,抽象代数,线性代数,微积分,游戏论等领域,要求选手有较为全面的数学基础。

本章通过介绍算法竞赛中常用的数学知识点与思考方法,并通过题目和代码加深读者对其的理解。

2.1基本计数方法:(计数题目,要注意防止中间溢出的情况,理论基础就是下方3个理论!)

理论:

  加法原理:做一件事有n个方法,第i个方法有Pi种方案,则一共有P1+P2+...+Pn种方案。

  乘法原理:做一件事有n个步骤,第i步有Pi种方案,则一共P1*P2*...Pn种方案。

  容斥原理:加加减减的规律,把重复的扣掉,再把扣多的加回来。

几个常见的计数例子:

(1)排列问题:n个不同的数中选择k个全排列,共有P(n,k)=n!/(n-k)!种方法。 特别地:P(n,n)=n!

(2)组合问题:n个不同的数中选择k个,不进行排列。已知:C(n,k)=P(n,k)/P(k,k);则其等于 n!/((n-k)!*k!)

  这里有几个特殊重要的性质: C(n,k)=C(n,n-k)  与  C(n+1,k+1)=C(n,k)+C(n,k+1); 即:C(n,k)=C(n-1,k-1)+C(n-1,k);

(3)求二项展开式:求(a+b)^n展开式的各项系数。

  C(n,k+1)=C(n,k)*(n-k)/(k+1)。----可以用来求(3):从C(n,0)开始,O(n)的时间即可求出所有的系数。

(4)有重复元素的全排列:有k个元素,第i项元素有ni个。

  则全排列个数:  x =  n!/(n1!*n2!*...nk!);

(5)可重复选择的组合:(隔板法)

  有n个元素,每个元素可以选多次,一共可以选k个元素,问共有多少种方法?

分析:

  设第i个元素选择xi个,则问题转化为求方程: x1+x2+...xn = k 的非负整数解的个数;

  这里令: xi + 1 = yi ,则答案为:y1+y2+...yn = k 的正整数解的个数,想象有n+k个数字1排成一排,问题等价于把这些1分成n个部分。

这里使用隔板法!从n+k-1个间隙中选择n-1个,即C(n+k-1,n-1)。(这里的yi每个减1,即为每个元素被选中的个数!)

(6)单色三角形:(寻找问题特点,即突破口,本题中提到的特殊点,判别要求即突破口!)

问题描述:有n个点,没有三点共线的情况,每两个点之间都使用红或黑颜色的线相连,求三条边同色的三角形个数?

问题解决:

  首先全部枚举是O(n^3)的时间,需要优化。

  这里从反面考虑,依次按照点的顺序来判断,若:第i个点连接了ai个黑边,连接了(n-1-ai)条红边,则这些边属于ai*(n-1-ai)个非单色三角形,每个都考虑了两次,结果除以2即可。最终答案: ai*(n-1-ai)/2 ( i 的范围为从0到n-1) 。

 

提示:

  计数问题一定要考虑算术运算的溢出!

 

 例1:象棋中的皇后:(分情况讨论,乘法原理,加法原理的运用)(AC)

题目描述:

  给定n*m的棋盘,有多少种方法放置两个相互攻击的皇后?

题目解决:

  首先确认:两皇后在同一行、同一列、同一对角线的情况不会重复,这里使用分类,加法原理相加。

  分情况讨论3种情况:(内用乘法原理)

    同行: n*m*(m-1)

    同列: m*n*(n-1)

    同一对角线:对于所有的对角线,从左到右依次为: 1,2,3,...n-1,n,n,...n,n,n-1,...3,2,1 

  每种情况加起来即可。

 

 例2:数三角形(数学分析,找到突破口,本题是依次考虑最长边为 x 的三角形个数,最后再相加)

 

例3:拉拉队:(容斥原理的运用!)

 题目描述:

  在一个m行n列的矩形网格中,需要放置k个相同的石子,文友多少种放法?每个格子最多放一个石子,所有石子都要用完,并且第一行、最后一行、第一列、最后一列都必须有石子。

分析:

  考虑第一行、最后一行、第一列、最后一列都没有石子的方案数,使用容斥原理进行求解。

 

2.2递推关系:

几个常见的递推例子:

(1)兔子繁殖:斐波那契数列

(2)凸多边形的三角剖分数:Catalan(卡特兰)数

  f(n)=f(2)*f(n-1)+f(3)*f(n-2)+...+f(n-1)*f(2);   根据某顶点k进行分类(k需要枚举),则V1VnVk左边是一个k边形,右边是一个n-k+1边形,根据乘法原理可得!

(3)火柴

(4)立方数之和:

(5)村民排队:

(6)带标号连通图计数:

 

例4:多叉树遍历:

问题描述:

  给定一个先序遍历序列,问有多少棵树与之对应?

分析:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值