算法竞赛入门经典训练指南【递推问题】------2015年1月24日

1. 常见的数列总结

(1)斐波那契数列:

如何实现斐波那契数列,我们可以采取如下方法:

(1)递归求解(慢)(2)递推法 (3)矩阵快速幂

下面给出矩阵快速幂的由来:

除了这些问题,我们对于斐波那契数列还可能涉及高精度数的处理问题。

(2)卡特兰数

卡塔兰数组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (18141894)命名。

卡塔兰数的一般项公式为                       另类递归式:  h(n)=((4*n-2)/(n+1))*h(n-1);

前几项为 (OEIS中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

性质

Cn的另一个表达形式为 所以,Cn是一个自然数;这一点在先前的通项公式中并不显而易见。这个表达形式也是André对前一公式证明的基础。(见下文的第二个证明。)

卡塔兰数满足以下递推关系

它也满足

这提供了一个更快速的方法来计算卡塔兰数。

卡塔兰数的渐近增长为

它的含义是左式除以右式的商趋向于1当n → ∞。(这可以用n!的斯特灵公式来证明。)

所有的奇卡塔兰数Cn都满足n = 2k − 1。所有其他的卡塔兰数都是偶数。

应用

组合数学中有非常多.的组合结构可以用卡塔兰数来计数。在Richard P. Stanley的Enumerative Combinatorics: Volume 2一书的习题中包括了66个相异的可由卡塔兰数表达的组合结构。以下用Cn=3和Cn=4举若干例:

  • Cn表示长度2n的dyck word的个数。Dyck word是一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words:

XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY

  • 将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数:

((())) ()(()) ()()() (())() (()())

  • Cn表示有n+1个叶子的二叉树的个数。

  • Cn表示所有不同构的含n个分枝结点的满二叉树的个数。(一个有根二叉树是满的当且仅当每个结点都有两个子树或没有子树。)

证明:

令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有个,下面考虑不满足要求的数目.

考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个n+1个0和n-1个1的二进制数。反之亦然(相似的思路证明两者一一对应)。

从而。证毕。

  • Cn表示所有在n × n格点中不越过对角线的单调路径的个数。一个单调路径从格点左下角出发,在格点右上角结束,每一步均为向上或向右。计算这种路径的个数等价于计算Dyck word的个数: X代表“向右”,Y代表“向上”。下图为n = 4的情况:
  • Cn表示通过连结顶点而将n + 2边的凸多边形分成三角形的方法个数。下图中为n = 4的情况:

  • Cn表示对{1, ..., n}依序进出置换个数。一个置换w是依序进出栈的当S(w) = (1, ..., n), 其中S(w)递归定义如下:令w = unv,其中nw的最大元素,uv为更短的数列;再令S(w) =S(u)S(v)n,其中S为所有含一个元素的数列的单位元。
  • Cn表示用n个长方形填充一个高度为n的阶梯状图形的方法个数。下图为 n = 4的情况:

时间: 2024-10-15 23:07:52

算法竞赛入门经典训练指南【递推问题】------2015年1月24日的相关文章

算法竞赛入门经典训练指南

最近在看算法竞赛入门经典训练指南这本书,书中不错的算法我将在博客中发布,和大家共同学习. 题目: 在你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个能力值为m的骑士可以砍掉一个直径不超过x的头,且需要支付x个金币.如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次). 输入格式: 输入包含多组数据.每组数据的第一行为正整数m和n(1<=m,n<=20 000):以下m行每行为一个整数,即恶龙每

算法竞赛入门经典-训练指南(10881-Piotr&#39;s Ants)

题目大意: 一根长度为L的木棍一堆蚂蚁爬,向左或向右,速度都为1,若两蚂蚁碰撞则同时转头(转身时间忽略不计),问T时间之后每只蚂蚁的位置: 输入:t,(t个样例),每个样例输入 L,T,n,接下来是n行每行两个数据,一个POS(位置),一个dir(方向): 输出:按输入顺序输出每只蚂蚁的最终位置,若处于碰撞状态则输出Turning,掉下去输出"Fell off": 解题思路: 本题类似于<挑战程序设计>的一道水题(POJ -1852  Ants),思路题:不过本题输入并不一

《算法竞赛入门经典——训练指南》第二章题库

UVa特别题库 UVa网站专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=442 注意,下面注有"extra"的习题并没有在书中出现,但在上面的特别题库中有,属于附加习题. 基础练习 (Basic Problems) UVa11388 GCD LCM UVa11889 Benefit UVa10943 How do y

算法竞赛入门经典——训练指南

1. UVa 11300 我的代码: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; long long C[1000010], M, a; int main() { int n; while (~scanf("%d", &n)) { C[0] = 0; for (int i = 1; i <= n; i++) { scanf(&q

UVa11300——算法竞赛入门经典训练指南

(xl)LT1-3 这道题还是比较考验数学水平,由于所有的交换仅限于相邻两个人之间的交换,所以容易列n-1个方程组,要注意到这是一个环,所以第n个方程是可以被推导出来所以不能算作有效的方程组,即使无法解出所有的值,但是我们注意到,只要求一个最小值,那么这种求极值问题,就可以通过x1一个变量来表示所有的,即消元完成.这样转化为“单变量极值问题”. 然后就是显然的坐标上求啊求...再用显然的中位数就可解了. 然而编程的时候就是恶心,我一直以为我的式子可能错了,然而问题竟然是tot没有初始化,恶心啊恶

UVa11729——算法竞赛入门经典训练指南

(xl)LT1-2 这道题还是没什么难度,但是注意一下运算符重载,以便sort,以及构造成员,还有sort遇到vector用迭代器. 写了两份代码. 先附上自己的普通方法: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1000+5; struct soldier{ int b; int j; bool operator <(c

【读书笔记/复健向】算法竞赛入门经典训练指南1.1贪心部分

例题一(UVa11292) 基础贪心,没什么需要多讲的,直接放上代码.有一点要注意的是我第一遍写的时候竟然犯了两个错误. 错误点 将dragon.knight与i.j对应错误了,仔细一想人有先后对应的天性,下次设置i.j时还是老老实实根据输入顺序来,避免出错 第23行遗漏了(j<n)这个条件,使得在龙已经全被砍头的情况下却雇佣了剩余的骑士. 本题重点 砍龙头的时候设置两个指针,分别移动,使用频率挺高的一个小技巧,不难,但是挺重要的. 1 #include<iostream> 2 #inc

算法竞赛入门经典训练指南-做题详细记录(更新中)

第一章 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 typedef long long ll; 6 //吐槽:WA一次.原因是不会输出 Loowater is doomed.由于原代码没有判断骑士是否已经杀了一个头.鉴于题目里提到n>=1.所以一旦有骑士杀了龙,那么就让骑士 b[i]=-1,这样他就相当于被标记过了.本来还想开个b

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不