递推求解算法

先来看一个简单的问题:

有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) 。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值