题目描述

圆上有 2n 个不同的点, 两点之间连成直线段, 要求这些线段不能共点. 计算出有 12 个点时共有多少种不同的连线方式. 设计 C 语言函数, int count (int n), 计算并返回圆上有 2n 个点时的连线方式数量.

分析

我们可以使用递归的思想来求解这道题.

设 2n 个节点的连线方法种数为 (F(n)).

如上图(这里取 n = 4), 不妨给所有的点进行编号, 然后我们分析第一个节点, 发现从 1 号节点出发可以分为两种情况:

第一种: 1 和 2 或者 8 相连, 那么一共有 (2 imes F(2 imes 4 - 2)) 种连法.

第二种: 1 和 3 到 7 号的节点相连. 我们举个例子, 如果 1 号节点和 4 号相连, 那么, 这个圆就被分成了左下和右上两个部分(以黄色线为分割线), 此时有 (F(2) imes F(4)) 种连法. 把所有的情况累加, 一共有 (displaystylesum_{k = 2}^{4 - 1}F(2k - 2)F(8 - 2k)) 种连法.

上面的是一个特殊个例, 然后我们推到一般情况的公式就是:

[F(2n) = 2 imes F(2n - 2) + sum_{k = 2}^{n - 1}F(2k - 2)F(2n - 2k)

]

其中, (F(0) = 0, F(1) = 0, F(2) = 1).

代码

C语言实现

#include

#include

/**

* 求解圆上 2N 个点连线问题

* @param n 表示 2N, 为偶数

* @return 结果数

*/

long count(int n)

{

if (n == 2)

return 1;

long dp[n + 1];

memset(dp, 0, (n + 1) * sizeof(long));

dp[0] = dp[1] = 0;

dp[2] = 1;

for (int i = 4; i <= n; i += 2)

{

long sum = 0;

for (int k = 4; k <= i - 2; k += 2) // 选 4, 6,..., n - 2 的情况

{

sum += (dp[k- 2] * dp[i - k]);

}

dp[i] = 2 * dp[i - 2] + sum; // 这里要加上选 1 和 选 n - 1 的情况

}

return dp[n];

}

int main() {

// 打印 9 个测试数据

for (int i = 2; i < 20; i += 2)

{

printf("%d

", count(i));

}

return 0;

}

测试结果:

1

2

5

14

42

132

429

1430

4862

Python实现

# -*- coding: utf-8 -*-

# @File : CircleCatalan.py

# @Author: 模糊计算士

# @Date : 2020/11/27

def count(n):

if n == 2:

return 1

dp = [0] * (n + 1)

dp[0] = dp[1] = 0

dp[2] = 1

for i in range(4, n + 1):

sum = 0

for k in range(4, i - 2 + 1):

sum += dp[k - 2] * dp[i - k]

dp[i] = 2 * dp[i - 2] + sum

i += 2

return dp[n]

for i in range(2, 100, 2):

print(count(i))

测试结果:

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

18367353072152

69533550916004

263747951750360

1002242216651368

3814986502092304

14544636039226909

55534064877048198

212336130412243110

812944042149730764

3116285494907301262

11959798385860453492

45950804324621742364

176733862787006701400

680425371729975800390

2622127042276492108820

10113918591637898134020

39044429911904443959240

150853479205085351660700

583300119592996693088040

2257117854077248073253720

8740328711533173390046320

33868773757191046886429490

131327898242169365477991900

509552245179617138054608572

从这些结果数据来看, 它们正是卡特兰数.

求解圆上2N个点的连线问题(卡特兰数)

c语言程序设计卡特兰数问题,求解圆上2N个点的连线问题(卡特兰数)相关推荐

  1. 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  2. 《C语言程序设计:问题与求解方法》——1.4节本章习题

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第1章,第1.4节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 一 ...

  3. 《C语言程序设计:问题与求解方法》——3.9节常见编程错误

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.9节常见编程错误,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 3.9 ...

  4. 《C语言程序设计:问题与求解方法》——0.5节本章习题

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第0章,第0.5节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 1 ...

  5. 大学 C语言程序设计第一讲,c语言程序设计1第一讲(第一章上).ppt

    c语言程序设计1第一讲(第一章上).ppt 知识可以改变命运! 高级语言程序设计 主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 cyjia@bjtu.edu.cn 计算机与人沟通 计算机 ...

  6. linux 取文件字节数,如何在Linux上的C中获取文件中的字符数(而不是字节数)

    我想获取文件中的字符数.字符我的意思是"真正的"字符,而不是字节.假设我知道文件编码. 我尝试使用mbstowcs()但它不起作用,因为它使用系统区域设置(或使用setlocale ...

  7. 谭浩强c 语言程序设计

    谭浩强c 语言程序设计  1 C语言概述  1.1  C语言的发展过程  1.2  当代最优秀的程序设计语言  1.3  C语言版本  1.4  C语言的特点  1.5  面向对象的程序设计语言  1 ...

  8. c语言消隐的作用是什么,【C语言程序设计最终版材料】

    C语言程序设计(最终版) <C语言程序设计.doc>由会员分享,可免费在线阅读全文,更多与<C语言程序设计(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿 ...

  9. 0039c语言作业答案2020,西南大学2019年网络与继续教育[0039]《C语言程序设计》大作业试题(资料).doc...

    西南大学2019年网络与继续教育[0039]<C语言程序设计>大作业试题(资料).doc 文档编号:764150 文档页数:4 上传时间: 2019-10-12 文档级别: 文档类型:do ...

  10. char类型怎么输入 c语言_C语言程序设计知识点总结(通用)

    微信搜索学生之家考前必备关注我们 <C语言程序设计>知识点总结(通用) 总体上必须清楚的: 1)程序结构是三种:  顺序结构 .选择结构(分支结构).循环结构.  2)读程序都要从main ...

最新文章

  1. AT91RM9200+pcf8563在linux2.6.20下的调试心得
  2. linux里的dd权限不够怎么办,Linux dd 遇到 容量不足 的 resize 解法
  3. 图解JVM垃圾回收算法
  4. 技术开发人员适应其他部门提需求的一个经验
  5. leetcode-654-最大二叉树
  6. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
  7. c++primer 12.3.1文本查询程序
  8. Prometheus 监控Mysql服务器及Grafana可视化
  9. 被问到TCP的可靠传输和提高网络利用率?
  10. 常用chrome插件常用FireFox插件
  11. Atitit 跨平台跨语言图像处理与node.js图像处理之道 attilax著 1. 著名跨语言类库 ImageMagick简介、GraphicsMagick、命令行 1 1.1. opencv
  12. arduino教程-13. 蓝牙
  13. CoreData多线程安全
  14. IDEA引入WebService接口
  15. .net的反射技术(2)深究及 性能比较
  16. Outsider(HNOI2019)
  17. 7天入门数据库 day23 - 数据表的CURD
  18. D.E. Shaw:“股涨债跌”的幕后操手竟是各国央行?
  19. 破解仓储难题?看WMS如何解决
  20. 最新UI界面漫画小程序源码,带后台支持流量主,24小时全自动更新!

热门文章

  1. qt repaint 用法_QT 界面绘制刷新机制
  2. 5G接入网学习:回顾电调天线
  3. java 遍历文件夹下所有文件及目录
  4. 局域网SDN技术硬核内幕 二 从局域网到互联网
  5. 数据库 sqlserver实现插入随机姓名性别民族
  6. u盘带走的绿化wamp配置方式
  7. \x3c\x73\x63\x72\x69\x70\x74\x3ealert('xss');\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e
  8. IGBT工作原理及作用
  9. 三电平igbt死区时间计算_三电平IGBT功率模块
  10. 吾爱404错误页面圈小猫游戏代码