首页 > 代码库 > 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数)