递归算法----Catalan数----笨笨连线游戏

本文介绍了一款名为“笨笨连线游戏”的问题,探讨了如何通过递归和递推的方法解决该问题,并给出了具体的实现思路及Catalan数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

笨笨连线游戏

【题目描述】

一天,妈妈在黑板上画了一个大大的圆,然后又在圆弧上标上123...,2N个数。然后让笨笨任意选取一对数(两个不同的数)上连一条直线。然后再任意选取一对数,再边一条直线,但这条直线不能和任何别的直线相交。每个数都要恰好与另一个数连一条直线。

笨笨费了好大的劲才找出一种连线方案。妈妈在旁边问笨笨:给出N,请问不同的连线方案有多少种呢?

笨笨算不出来,只好请教作为大牛的你。

【输入】

多组数据,每组数据的格式为:

1行:1个整数N1<= N <= 150),表示在圆弧上会标记2N个数

当输入的N0时,表示输入结束

【输出】

每组输入对应输出一行,一个整数,表示连线的方案数。由于结果太大,只保留模10007后的余数。

【样例输入】

0  

【样例输出】

2

5

二、分析

这道题目主要考察大家的递归知识,也可以用递推来做。题目的思路类似Catalan数,要注意找规律。

再分析一下题目的数据范围,用递归绝对会栈溢出,但是数据不会超限,所以不用高精度算法。

我们可以用记忆化递归调用,用一个int c[155]数组来储存f(1)到f(n)的数据。

下面是找规律:

f(0)=1----非常重要

f(1)=1

f(2)=f(0)*f(1)+f(1)*f(0)

f(3)=f(0)*f(2)+f(1)*f(1)+f(2)*f(0)

...

最终找到规律:

f(n)=f(0)*f(n-1)+f(1)*f(n-2)+f(2)*f(n-3)...+f(n-1)*f(0)

接下来的代码都非常简单了,用if语句来判断c[n]中是否为空,为空就调用f(n),就可以了。


Catalan数还有一个一阶递推公式:f(n)=f(n-1)*(4*n-2)/(n+1),其中n>1,f(0)=f(1)=1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值