先来看一个简单的问题:
有5人坐在一起,当问第5个人多少岁,他说比第4个人大2岁,问第4个人多少岁,他说比第3个人大2岁,依次下去,问第一个人多少岁,他说他10岁。请问:第5个人多少岁?
(如果所坐的不是5人而是n人,请写出第n个人的年龄表达式。)
常见的数学公式:f(n) = 10 + (n-1)*2
递推公式(状态转移方程):
f(1)=10
f(n)=f (n-1)+2 ( n > 1 )
Fibnacci 数列
f(1)=1
f(2)=1
状态转移方程:
f(n)=f(n-1)+f(n-2) ( n > 2 )
即:1、1、2、3、5、8、13、21、34……
递推公式相关问题:
例1:在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。
解题思路:
n=1,f(n)=2
n=2,f(n)=4
n=3,f(n)=7
f(n)=f(n-1)+n
初始状态:F(1)=2;
状态转移方程:F(n)=F(n-1)+n;
化简:F(n)=n(n+1)/2+1;
例2:平面上有n条折线,这些折线最多能将平面分割成多少块?
Sample Input:
1
2
Sample Output:
2
7
解题思路:
F(1)=2;
F(2)=7;
F(n)=?
要使将平面分割的块数最多,即每次分割必定多增加4(n-1)个节点,即每加上一条折线就多增加4(n-1)+1块区域,因此状态转移方程为:
F(n)=F(n-1)+4(n-1)+1。
例3:在 2×n 的长方形方格中,用 n 个 1×2的骨牌铺满方格,例如n=3时,为2×3方格,骨牌的铺放方案有三种(如图所示),输入n,输出铺放方案的总数。
解题思路:
F(1)=1;
F(2)=2;
F(3)=3;
......
F(n)=?
我们可以从后面来看,可以分成2类:
1)右上角横着放
2)右上角竖着放
若竖着放则前面共有F(n-1)
若横着放则前面共有F(n-2)
即 F(n)=F(n-1)+F(n-2);
例4:有个1×n的长方形,用1×1、1×2、1×3的骨牌铺满方格。例如:当n=3时为1×3的方格(如图所示),此时共有四种铺法。
即: 1)3个1×1
2)1个1×1 + 1个1×2
3)1个1×2 + 1个1×1
4)1个1×3
这题与上题类似,
最后一个格子有3种情况:
1)1×1 即 前面共有F(n-1)种
2)1×2 即 前面共有F(n-2)种
3)1×3 即 前面共有F(n-3)种
即状态转移方程为:
F(n)=F(n-1)+F(n-2)+F(n-3);
总结:递推求解的基本方法
1)首先,确认:能否容易的得到初始状态的解?
2)然后,假设:规模不大于N-1的状态已经得到解决。
3)最后,重点分析:当规模扩大到 N 时,如何枚举出所有的情况,然后用子问题的状态(F(1)、F(2)、... 、F(N-1))表示出最终的状态F(N)(即:状态转移)。
现在来看这样一个例题:
2n个正整数(1~2n)按顺时针围成一圈,在这2n个数字之间用n条直线相连,且直线不能相交,问共有多少种合法的连线方案?
解题思路:
F(1)=1;
F(2)=2;
...
F(n-1)=...
假设n=4的情况,即共8个正整数(0~8),1只能和偶数连,若1和2连,即剩余的是 F(n-1) 的情况。若1和4连,分为两部分,即剩余的是左边是F(n-2)种,右边是F(1)种,又相互独立,所以为F(1)×F(n-2)。若1和6连,又分为两部分,此时左边为F(n-3)种,右边为F(2)种,即F(2)×F(n-3)。以此类推,一直到 F(n-1)×F(0)。
即 F(n)=F(0)×F(n-1)+F(1)×F(n-2)+F(2)×F(n-3)+...+F(n-1)×F(0) 。
不难看出此规律为卡特兰数(Catalan Number)。
卡特兰数的前面若干项分别是:1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,...
即:
当然,卡特兰数有着非常多的应用。
例如:
多边形的三角剖分数目
加括号问题
下楼梯问题
等等...
总结:
若一个数列满足以下递推关系,则c[n]即为第n项卡特兰数:
c[0]=1;
c(n)=c(0)×c(n-1)+c(1)×c(n-2)+c(2)×c(n-3)+...+c(n-1)×c(0) 。