题目大意:一个圆上有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;
}
时间: 2024-11-11 02:29:49