1
plan9 OP 目前的想法是这样的
1,求所有对角线 2,从里面取m个对角线并查看是否相交,如果不相交则count加一 3,重复2,直到对角线都取了个遍 有其他更好的吗 |
2
aa88kk 2012-10-25 15:17:39 +08:00
简单想了下,应该是个排列组合问题, 先从n个点选m, m多边形再两两相连,找出不相交的两条线。
|
3
plan9 OP @aa88kk m是对角线的个数,2条对角线可能有2个顶点,也可能有4个顶点,而且可能我表达的不够清楚,要找的不是2条对角线,而是要找m条不相交的对角线的可能性有几种
比如有1,2,3,4,5这5个顶点,2条不相交的对角线为 13,14 24,25 31,35 42,41 52,52 因此有5种可能性 |
5
chx007 2012-10-25 19:14:46 +08:00
是正多边形吗?
如果不是,是凸多边形吗? 如果不是,多边形自身的边有没相交呢? |
6
chx007 2012-10-25 19:28:06 +08:00
如果是凸多边形(包括正多边形)应该是吧
m = n * ( n - 3 ) / 2 |
7
momou 2012-10-25 21:23:34 +08:00
给多边型定义一个坐标系,就很容易解决了。。。
|
9
luin 2012-10-25 21:53:23 +08:00
想象成一维的就好解决了啊
|
16
zellux 2012-10-26 00:03:55 +08:00
和 Catalan 数的算法有点类似。取一条对角线把多边形分成两个,接下来要在左右两个多边形中一共取 m - 1 条,可能的取法是左边 0 条,右边 m - 1 条;左边 1 条,右边 m - 2 条……;左边 m - 1 条,右边 0 条(这里有些取法可能不成立,比如左边是三角形的话就只能取 0 条对角线)。这样递归下去就能算出来了。
|
17
Air_Mu 2012-10-26 00:12:28 +08:00
请用严谨的语言描述数学问题。不相交具体到底上什么情况?是在图形内不相交还是完全不相交(平行)。或者说AB 和AC这两条线相交于点A 这算相交还是不相交?
还有,这多边形是什么样的多边形?这种变态的图形也是多边形哦: |
19
plan9 OP |
20
plan9 OP @Air_Mu 问题上没有说是什么样的多边形。。。就是说你这种变态多边形的也是可能的
相交的话只说了是在多边形的内部相交,那么AB 和AC这两条线相交于点A应该不算相交了 其他的描述就什么也没有了,还没有我这里描述的详细。。。 |
21
darkgt 2012-10-26 02:22:20 +08:00
见过类似的问题,参见http://discuss.codechef.com/questions/1968/maxgame-editorial
不过那个问题没有限制对角线的个数(m),而且K=1的时候是要求对角线不能共点。 @zellux说的会导致重复情况被算了多次,不过做法类似。 放对角线的过程可以看做: 给一个n个点多边形形状的蛋糕,然后每次沿着2个顶点切一刀,(这两块蛋糕有一块只有1个刀痕,另一块有2个刀痕),留下那个有1个刀痕的,重复上面的过程。 有个问题是重复计算,比如(0,1,2,3,4,5)的一个方案是(0,4)(0,3)(1,3),先切(0,4)或(1,3)都会产生这个结果。不过还好,这种对于每种方案,只重复了2次(这里需要一些抽象思维),因为切蛋糕的顺序只能是(0,4)(0,3)(1,3)或者(1,3)(0,3)(0,4),两种方案是顺序反过来的。 下面说做法: 首先考虑在一个n点多边形(蛋糕^^)放一条对角线,会把多边形分成 i个点 和 n-i+2个点的两个多边形(稍微比划一下就能想出来),只在i个点那个多边形里继续操作,然后将最后的合法方案数/2。 递归是非常慢的,实现上使用动态规划就可以了。 dp[n][m]表示在个n点多边形放m个对角线的方案数,dp[n][m] = sum( dp[i][m-1] ),i=3~n-i-1 两个循环即可,复杂度O(n*n*m) |
22
darkgt 2012-10-26 02:36:05 +08:00
更正一下。
计数那里有点问题,在一个有n个边的蛋糕切一刀,保留有i条边的子蛋糕(并且只有1个切痕),这个过程的方案刚才忘考虑了。 我想了下,应该是n-i+1 所以 dp[n][m] = sum( dp[i][m-1]*(n-i+1) ) |