摘要:这一章节开始介绍一个数据结构中的一个基本概念——树。 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列、数组和链表等结构表征),还有一个重要的特性——层级结构需要我们去表征,例如世界杯的对阵表、遗传系谱图等等,这时候我们基于对现实世界的抽象,会很自然的理解为
阅读全文
摘要:分块矩阵的概念: 在矩阵的实际应用中,为了形式的更加简化我们将一个较大的矩阵的内部进行一定的划分,使之成为几个小矩阵,然后在表大矩阵的时候,矩阵的内部元素就用小矩阵代替。 进行了这一步简化,我们就要分块后的矩阵满足怎样的运算规律。 分块矩阵的运算: 分块矩阵的标量加减:很容易想到,只要大矩阵的维度相
阅读全文
摘要:贪心策略:选择不相交区间问题。 抽象化描述:给出n个区间[ai,bi],从中选出尽可能多的区间,使得这些区间能够不相交。实际问题当中的应用:这个模型常常以日程安排的实际问题作为载体进行考察。 贪心策略分析: 首先我们应该明白的一点是,如果一个区间c是另一个区间d的子区间,那么很显然我们是不会去选区间
阅读全文
摘要:算法分析初步: 在任何一本比较正经的算法书当中,第一章都会介绍算法正确性的证明方法和对算法复杂度的分析,因为算法本身两个重要的特性就是正确性和高效性,只有保证了这两部分方能设计出有实际利用价值的算法。 那么这篇文章通过一个简单的题目来初步探讨一下如何进行算法时间复杂度的分析。 需要指明的是,算法的复
阅读全文
摘要:解答树: 所谓解答树,其实和dfs、递归有着很大的联系的。可以说dfs就是基于一个解答树来实现的。但是什么是解答树呢?其实可以类比生成所有全排列的这样一个过程:完成一件事情需要n个步骤,这n个步骤的先后顺序并不会对方案本身产生影响,这样我们如果建立一个根节点,那么第一个步骤就有n种选择,即根节点有n
阅读全文
摘要:乘船问题: 有n个人,第i个人重量为wi,每艘船的最大载重量均为C,且最多只能乘2个人。用最少的船装载所有人。 分析:显然这道题考查我们对贪心法的理解。在很多问题中,往往是贪心策略的给出很容易但是证明却比较困难。这里我们将给出证明来开始尝试掌握对算法正确性的证明的几种方法。 首先我们给出贪心策略,首
阅读全文
摘要:矩阵的逆: 逆矩阵的定义: 类比于我们在研究实数的时候回去讨论一个数的倒数,对应的,在矩阵运算中,当AB = I的时候,A,B互称为逆矩阵,这里的I类似实数中的1,表示单位矩阵,即对角线是1其余位置是0的n x n的矩阵。 逆矩阵的唯一性: 逆矩阵是像实数的倒数一样唯一存在的么?我们不妨简单地证明一
阅读全文
摘要:之前我们曾经提及,完成了线性方程组-向量方程-矩阵方程的等价转化之后,我们对于现实问题中的线性方程组,只需将其转移到矩阵(向量)方程,然后利用矩阵代数中的各种方法和性质进行计算或者化简即可,而下面我们就去着力探讨矩阵代数。 需要在一开始就点到的是,无论是矩阵的加法还是乘法,我们都强调有定义,这个再具
阅读全文
摘要:基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”。 流问题的基本概念: 首先给出一张图。 其实所谓“网络流”,其模型是非常有现实意义的。我们将该图视为计算机网络结构。此图中,s称其为源点而t称其为汇
阅读全文
摘要:数组上的一个基本优化——部分和: 对于一定长度的数组,我们想不断访问这个数组上的某个区间的和,我们能够怎么做呢?这里先不去谈一些数据结构在这个问题上的优化处理。首先我们最简单的一个方法就是穷举出所有区间段然后求值保存起来,但是O(n^2)的时间复杂度并没有太多的实际应用的意义。 这里考虑一个非常简单
阅读全文
摘要:线性变换: 先前我们曾经提到过,在讨论矩阵方程Ax = b和向量方程x1a1+x2a2+x3a3+…+xnan = b同解性的时候,我们曾经说过这这将呼应了矩阵乘法运算的规则。但是在这里我们首先介绍一个过渡的概念——线性变换。 考察矩阵方程Ax = b,A是n x m矩阵,x是R^n向量,由先前我们
阅读全文
摘要:Lucas定理: 在组合计数问题中,我们常面临组合数C(n,m)过大而无法直接计算的困境,那么这里的Lucas定理给出了一个较大组合数进行取余运算的一种递归算法。 什么是Lucas定理? Lucas定理的推导证明? 这个推导过程基于二项式定理,基于最后的等式,我们通过过找等是左边和右边x^(tp +
阅读全文
摘要:这篇文章主要简单的记录所谓的“线性相关性”。 线性相关性的对象是向量R^n,对于向量方程,如果说x1v1 + x2v2 + …+xmvm = 0(其中xi是常数,vi是向量)有且仅有一个平凡解,那么我们称m个向量组成的集合{v1,v2,v3…vm}是一个线性无关集,反之,则称向量集合{v1,v2,v
阅读全文
摘要:关于这一章节《算法实战策略》有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作。相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者不经过深思熟虑就开始打键盘,结果还要辛辛苦苦修改变得一塌糊涂的代码。经过这些磨难,各位就能切身体会到设计算法的重
阅读全文
摘要:非线性方程求根: 一次向银行借a元钱,分b月还清。如果需要每月还c元,月利率是多少(按复利计算)?例如借2000元,分4个月还每月510元,则月利率为0.797%。答案不应超过100%。 分析:首先我们先从数学的角度来理解题意,需要注意的是,这里所谓复利的意思应该是指每个月涨息之后然后还贷,这样是非
阅读全文
摘要:有关递归与分治的几个问题: Q1:有一个2^k * 2^k的方格棋盘,恰有一个方格是黑色的,其他为白色的。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。 分析:这道问题我们在《algorithm puzzle》一书的专栏中曾经有过
阅读全文
摘要:6174问题: 假设你有各位数字不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来这个数,并继续操作。例如,从1234出发,依次可以得到4321-1234 = 3087、8730-378=8352、8532-2358=6174.有趣的是,7641-1467=6
阅读全文
摘要:周期字符串: 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。 样例输入:HoHoHo 样例输出:2 分析:基于这道题目的数据量,这里利用基本的穷举法就可
阅读全文
摘要:可以说数学是算法的基石,那么这里便通过介绍几道数学题目来窥探一下数学思维如何和编程有机的结合起来。 Cantor的数表:有下列数,第一项是1/1,第二项是1/2第三项是2/1,第四项是3/1,第五项2/2,….。输入n,输出第n项。 1/1 1/2 1/3 1/4 1/5 2/1 2/2 2/3 2
阅读全文
摘要:在实际生产生活中,需要我们解大量的线性方程组,例如是有探测、线性规划、电路等,这里我们便从理论角度建立一套解决线性方程组的体系。 线性方程组: 形如下面形式的方程组称为线性方程组。 回想起解决二元线性方程组我们的处理方法,本质上就是高斯消元法的个例,在解决多元线性方程组的时候,我们使用的便是高斯消元
阅读全文
摘要:对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构。而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编程实践,这就需要基于数据结构。一个好的数据结构能够让我们更快更高效得处理数据,有些模拟性、数学背景并
阅读全文
摘要:向量: 向量的基本运算:向量的运算最基本的一件事情,就是基于它n个分量上进行,即对于两个分量的向量a = <a1,a2>,b = <b1,b2>,有a + b = <a1+b1,a2+b2>。聪明的读者可能已经想到了,这其实是与我们在高中物理的力学中所谓的“正交分解”是相互呼应的,而其实也是基于此,
阅读全文
摘要:辛普森法则是数值分析领域中一个非常简单好用的近似求解函数区间上的一种方法,概括起来,它是将区间端点和区间中点做对应的三个点近似看成抛物线(至于为什么是抛物线而不是直线或者三次曲线……相对于三次曲线甚至更高次肯定是为了计算的简便,相对于直线的话,想一想那是不是就是高数课本上定积分的定义了)上的三个点,
阅读全文
摘要:Uva 11300: 圆桌旁坐着n个人,没人有一定数量的金币,基尼总数能被n整除。每个人可以给他左右相邻的人一些金币,最重视的每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。 分析:似乎有约瑟夫环的即视感,但是模拟出来的情形显然要复杂的多而且无法控制“最少”这个指标,而达到“最小”的有
阅读全文
摘要:数据结构基础: 所谓数据结构即整合繁杂数据使之变得排列井然有序的结构,我们最为熟悉的数组,其实就是一种数据结构,它本质上是一种线性表,即“所有的元素排成一行”,同为线性表的数据结构还有队列、栈、链表等,通常在处理一些环状结构的时候,我们从任意一点截断,便可将其转化为线性表。 队列: 卡片游戏:桌上有
阅读全文
摘要:这一章节主要介绍我们在进行数值分析常用的二分、三分和一个近似求解区间积分的辛普森法。 首先介绍二分。 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解、线段树还有《algorithm puzzle》当中的“切割钢条”问题,都是基于二分思想。 下面我们
阅读全文
摘要:小球下落: 有一棵二叉树,最大深度为D,且所有叶子的深度相同。所有节点从上到下从左到右编号为1,2,3…2^D-1.在结点1处放一个小球,它会往下落。每个内节点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变。当小球达到一个内节点时,如果该节点上的开关关闭,则往左走,否则
阅读全文
摘要:问题:你有一块椭圆的地。你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。他们最多能把土地分成多少部分? 分析:容易想起来我们在《具体数学》第一章遇到的折线分平面问题,但是这里并不需要你求最多的交点数而是最多的分割平面数,二者必然有着联系,我们可以基于最多交点的递推关系尝试找分割平面的递
阅读全文
摘要:几何学中的欧拉公式:V-E+F = 2,V、E、F表示简单几何体的顶点数、边数、面数。 证明: 它的证明有多种,这里呈现一种递归证法。 对于任意简单几何体(几何体的边界不是曲线),我们考察这个几何体的每个面,设这个边成一个n边形,我们从某个固定顶点开始连接其其他各个顶点,即将这个n边形从某个顶点进行
阅读全文
摘要:KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s。 首先我们从整体来把我这个算法的思想。 字符串匹配的朴素算法: 我们容易想到朴素算法,即对于目标字符串s和检索对象字符串S,有如下的匹配流程。 while(没有完成匹配) { index
阅读全文
摘要:Pku 1143: Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows. The
阅读全文
摘要:pku 1107: Description Weird Wally's Wireless Widgets, Inc. manufactures an eclectic assortment of small, wireless, network capable devices, ranging fr
阅读全文
摘要:Poj1068: Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways: q By an integer sequence P =
阅读全文
摘要:这篇文章结合15pku暑期training的资料,简单介绍几种竞赛中常见的数据结构,包括线段树、树状数组、伸展树、后缀数组、并查集等。 需要点明的这,这个专栏的文章可以视作一个“预处理”,是作为笔者16年暑期pku集训的一个先导,因此拘于时间和精力很多知识点都是从整体上把握,缺少细节缺少证明也缺少代
阅读全文
摘要:基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数。 其实对于博弈游戏如Bash、Nim等基本类型,异或一些比较高级的棋类游戏例如井字棋、中国象棋、华容道等,可以说它们是同质的。 我们先从比较高的角度来看待如何得到博弈当中最优
阅读全文
摘要:写在前面:笔者将参加16年北大的暑期acm的集训,考虑到拿到比较好的学习效果,笔者开这个专栏用于整理一下15年集训的课件和资料。考虑到时间非常有限(一个月),加上考试缠身,很难以做到每个专题都结合例题代码,因此对于笔者比较熟悉的专题(dp、数论、组合、博弈)主要以整理思想和方法为主,对于没学过的专题
阅读全文
摘要:注:本文修改自三思科学《ENIGMA的兴亡》 ENIGMA ENIGMA看起来是一个装满了复杂而精致的元件的盒子。不过要是我们把它打开来,就可以看到它可以被分解成相当简单的几部分。下面的图是它的最基本部分的示意图,我们可以看见它的三个部分:键盘、转子和显示器。 在上面ENIGMA的照片上,我们看见水
阅读全文
摘要:困于时间缘故和考试缠身,笔者在先前关于《训练指南》的而第二章的数学基础的介绍先告一段落,开始对第一章简单的一些算法基础题目进行介绍。 Uva11292: 你的王国里有一条n个头的恶龙,你希望雇一些其实把它杀死(即砍掉所有的头)。村里有m个其实可以雇佣,一个能力值为x的其实可以砍掉恶龙一个半径不超过x
阅读全文
摘要:Uva:11361 数字和与倍数 给定正整数a、b、k,你的任务是在所有满足a≤n≤b的整数n中,统计有多少个满足n自身是k的倍数,且n的各个位数上的数字(十进制)和也是k的倍数? 分析:设f(x)是不超过x的非负整数满足题设要求的数量,对于这种求解一个区间上的解,则这道题目的解释f(b) – f(
阅读全文
摘要:短程线、距离:记Γ是vi到vi的一掉路径,Γi = min{Γ1、Γ2、Γ3…},那么Γi就是vi和vj之间的短程线,其长度即是vi与vj之间的距离。 点割集、割点:记p(G)为G的连通度,对于点集V的子集V’,V’任意的子集V’’,满足p(G-V’’)>p(G),那么V便成为一个点割集,当某个点割
阅读全文
摘要:与树相关的知识点: 相对来说清华大学出版社的这本《离散数学》有关树的这一章节还是比较简单地,概念也不多,有关树、森林、树叶、分支点、生成树、最小生成树等概念都很简单,这里不再累述,下面记录几个定理和重要的算法步骤。 定理1:设T<V,E>是n阶非平凡的无向树,则T至少有2片树叶。 证明:设T有k片树
阅读全文
摘要:几种特殊的图: 二分图: 定义:对于G,存在点集V1、V2满足V1∩V2 = ∅,V1∪V2 = V,并对于任意边eij,有vi、vj分别属于V1、V2,则称这样的图是二分图,也叫二部图、偶图、双图。这里需要注意的是,我们这里约定n阶零图(不含边的图)也是二分图。(并且这里我们主要讨论无向二分图)
阅读全文
摘要:Poj 2795: 给出一棵多叉树,每个节点都有大写字母,那么按照类似前序遍历的方法(区别在于回溯访问的点也记录),依次记录访问过的节点所记录的大写字母,直到访问完所有的点并回溯到根节点,我们会得到一个有大写字母组成的字符串序列,那么现在给出一个字符串序列S,问你共有多少个多叉树满足按照上面提到的遍
阅读全文
摘要:Uva11174: 村民排队:村子里现在有n(1≤n≤40000)个人,有多少种方式可以把它们排成一列,使得没有人站在他父亲的前面(有些人的父亲可能不在村子里)?输入n和每个人的父亲编号,输出方案总数除以1000000007的余数。 分析:首先我们应该能够看到的是,这种有关家庭关系的图,需要借助基本
阅读全文
摘要:Uva11137: 立方体之和:输入正整数n(n≤10000),求将n写成若干个正整数的立方体之和有多少种方法。 分析:这道题目其实就是基于递推的一道动态规划题目了,我们建立记录多状态的多段图,利用d[i][j]来表示立方数的底数不超过i且最终和为j的方法数,结合n的取值,有21^3 > 10000
阅读全文
摘要:Uva:11401 数三角形:有多少种方法可以从1,2,3,…,n中选出3个不同的整数,使得以它们为三边长可以组成三角形?(n≤1000000) 分析:如果直接暴力,参考n的取值范围,O(n^3)的复杂度势必不堪重负,因此这里需要一定的数学推导。 我们设c(x)为最大边长为x的三角形个数,f(n)为
阅读全文
摘要:图论里的一系列概念、性质、定理。 无向图中的平行边:字面理解,即是两个顶点相同的边,互称为平行边。 无向图重数:无向图中平行边的条数成为重数,这里要注意,是所有平行边的和而不是最大的一组平行边。 有向图中的平行边:与无向图平行边的定义很类似,但是这里要求起点和终点是一致的(即方向要一致)。 多重图:
阅读全文
摘要:关于简单的握手定理及其推论这里不在体现,这里我们记录三道利用握手定理并基于反证法的证明题。 Ex1:设n阶m条边的无向图G中,m=n+1,证明G中存在顶点v,满足d(v) ≥3。 证明:考虑反证法,既需要将待证命题的否命题归谬。首先我们写出带证明题的否命题:G中任意的顶点v,都满足d(v)≤2. 由
阅读全文
摘要:第二章:数学基础 基本计数方法: 在这一章节中有关基本的计数原理、容斥原理、二项式系数恒等式这里不再体现,这个专栏主要通过具体的题目来提升对理论知识的应用。 下面我们来看两个基本计数问题: ex1:可重复选择的组合:有n个不同元素,每个元素可以选多次,一共选k个元素有多少方法? 分析:设第i种元素选
阅读全文
摘要:这篇文章来介绍一些模拟题,即一类按照题目要求将现实的操作转换成程序语言。 zoj1003: On every June 1st, the Children's Day, there will be a game named "crashing balloon" on TV. The rule is
阅读全文
摘要:这个专栏开始介绍一些《ACM国际大学生程序设计竞赛题解》上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了)。 其实看书名也能看出来这本书的思路,就是一本题解书,简单暴力的通过题目的堆叠来提升解决编程问题的能力。 那么下面开始探索吧。 poj1037: Des
阅读全文
摘要:这一章我们将探讨有关图论匹配的有关内容。 首先我们给出具体的问题来并以此进行数学建模。 我们以男女婚配为例,现有n个元素集合Man:{m1、m2、m3......},n个元素的集合Woman:{w1、w2、w3......}。 匹配: 从Man中选择一个元素mi,在Woman中选择一个元素wj形成<
阅读全文