递归算法----Catalan数----笨笨连线游戏
来源:互联网 发布:js修改div背景颜色 编辑:程序博客网 时间:2024/04/30 16:20
一、题目描述
笨笨连线游戏
【题目描述】
一天,妈妈在黑板上画了一个大大的圆,然后又在圆弧上标上1,2,3,...,,2N个数。然后让笨笨任意选取一对数(两个不同的数)上连一条直线。然后再任意选取一对数,再边一条直线,但这条直线不能和任何别的直线相交。每个数都要恰好与另一个数连一条直线。
笨笨费了好大的劲才找出一种连线方案。妈妈在旁边问笨笨:给出N,请问不同的连线方案有多少种呢?
笨笨算不出来,只好请教作为大牛的你。
【输入】
多组数据,每组数据的格式为:
第1行:1个整数N(1<= N <= 150),表示在圆弧上会标记2N个数
当输入的N为0时,表示输入结束。
【输出】
每组输入对应输出一行,一个整数,表示连线的方案数。由于结果太大,只保留模10007后的余数。
【样例输入】
2
3
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;
- 递归算法----Catalan数----笨笨连线游戏
- 【算法】Catalan数
- 算法--Catalan数
- 一类连线问题中栈和Catalan数的应用
- 【模考3】笨笨连线游戏
- 算法 卡特兰Catalan数
- 算法模板——Catalan数
- 模拟考试9.3-笨笨连线游戏(route.cpp)
- 连线游戏
- Catalan数
- Catalan数
- Catalan数
- catalan数
- catalan数
- Catalan数
- Catalan数
- Catalan数
- Catalan数
- 通用的socket地址
- Unity ShaderLab学习总结
- 有向强连通图的Tarjan算法
- Eclipse luna Subversive(SVN) 的安装----note
- Eclipse常用插件
- 递归算法----Catalan数----笨笨连线游戏
- List<Map<String, Object>>
- EditText即时搜索,可限定时间工具类
- Linux学习---shell编程(13-for语句)
- JDBC中日期时间的处理技巧
- C++ Primer Plus (Six Edition) Chapter 2, Programming Exercises
- 渲染世界的OpenGL<6>基础变换
- JS 移除数组中指定索引项
- CaysnPrinter开发包接口说明文档及示例程序 - CAYSN IOS SDK_20160906