首页 > 代码库 > UVA991 - Safe Salutations(catalan数)
UVA991 - Safe Salutations(catalan数)
UVA991 - Safe Salutations(catalan数)
题目大意:一个圆上有n对点,要求这些点两两相连但是形成的直线又不相交。求这样的组合方案数。
解题思路:一开始不知道要怎么做,但是发现了样例的数据有点像catalen的前几项,后面看了别人的题解发现也是catalan数。做法:选一个点,与任意一个点相连,那么这条直线就将这个圆上的点分成了两部分。但是分成两个部分也是有要求的,两部分的都要是偶数个点,奇数个点的话就一定会有相交的线。
以n = 4(对)为例:f(i) :i对点。
f(n) = f(0) ? f(3) + f(1) ? f(2) + ? f(2) ? f(1) + f(3) ? f(1);
这个递推是就是catalan。最后用到书上的公式f(n + 1) = f(n)? (4 ? n - 6)/ n;
输出记得两个case之间要输出空行。
代码:
#include <cstdio>
#include <cstring>
const int maxn = 15;
int c[maxn];
void catalan () {
c[1] = c[2] = 1;
for (int i = 2; i <= 11; i++)
c[i + 1] = c[i] * (4 * i - 6)/ i;
}
int main () {
int n, cas = 0;
catalan();
while (scanf ("%d", &n) != EOF) {
if (cas++)
printf ("\n");
printf ("%d\n", c[n + 2]);
}
return 0;
}
UVA991 - Safe Salutations(catalan数)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。