您的位置:首页 > 其它

题目1103:区域赛系列一多边形划分

2017-09-22 21:52 302 查看

题目链接:

http://acm.nyist.net/JudgeOnline/problem.php?pid=1103

描述

Give you a convex(凸边形), diagonal n-3 disjoint divided into n-2 triangles(直线), for different number of methods, such as n=5, there are 5 kinds of partition method, as shown in Figure



输入

The first line of the input is a n (1≤n≤1000), expressed n data set.

The next n lines each behavior an integer m (3≤m≤18), namely the convex edges.

输出

For each give m,, output how many classification methods.

example output: Case #a : b

样例输入

3

3

4

5

样例输出

Case #1 : 1

Case #2 : 2

Case #3 : 5

算法思想:

Catalan数 百度百科-卡特兰数

因为凸多边形的任意一条边必定属于某一个三角形,所以我们以某一条边为基准,以这条边的两个顶点为起点P1和终点Pn(P即Point),将该凸多边形的顶点依序标记为P1、P2、……、Pn,再在该凸多边形中找任意一个不属于这两个点的顶点Pk(2≤k≤n-1),来构成一个三角形,用这个三角形把一个凸多边形划分成两个凸多边形,其中一个凸多边形,是由P1,P2,……,Pk构成的凸k边形(顶点数即是边数),另一个凸多边形,是由Pk,Pk+1,……,Pn构成的凸n-k+1边形。

此时,我们若把Pk视为确定一点,那么根据乘法原理,f(n)的问题就等价于——凸k多边形的划分方案数乘以凸n-k+1多边形的划分方案数,即选择Pk这个顶点的f(n)=f(k)×f(n-k+1)。而k可以选2到n-1,所以再根据加法原理,将k取不同值的划分方案相加,得到的总方案数为:f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)。看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n-2) (n=2,3,4,……)。

最后,令f(2)=1,f(3)=1。

此处f(2)=1和f(3)=1的具体缘由须参考详尽的“卡特兰数”,也许可从凸四边形f(4)=f(2)f(3)+ f(3)f(2)=2×f(2)f(3)倒推,四边形的划分方案不用规律推导都可以知道是2,那么2×f(2)f(3)=2,则f(2)f(3)=1,又f(2)和f(3)若存在的话一定是整数,则f(2)=1,f(3)=1。(因为我没研究过卡特兰数的由来,此处仅作刘抟羽的臆测)。

源代码

#include <iostream>
using namespace std;
int main()
{
int n,m,i;
int a[20];
a[1]=1;
for (i=2;i<=18;++i)
{
a[i]=a[i-1]*(4*i-2)/(i+1);
}
cin >> n;
for(i=1;i<=n;++i)
{
cin >> m;
cout <<"Case #" << i <<" : " << a[m-2] << endl;
}
return 0;
}


算法复杂度:

由源代码可知,第一种算法时间复杂度为O(n)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Catalan数