第二章:数学基础
介绍:
算法竞赛鄙视数学竞赛,但它是一门离不开数学的竞赛。它涉及组合数学,数论,概率论,抽象代数,线性代数,微积分,游戏论等领域,要求选手有较为全面的数学基础。
本章通过介绍算法竞赛中常用的数学知识点与思考方法,并通过题目和代码加深读者对其的理解。
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:多叉树遍历:
问题描述:
给定一个先序遍历序列,问有多少棵树与之对应?
分析: