凸多边形的最大顶点数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了凸多边形的最大顶点数相关的知识,希望对你有一定的参考价值。
对于一个多边形来说,在该多边形内任取两点,如果这两点连成的线段落在多边形内,则称这样的多边形为凸多边形。
平面上有N个坐标值为自然数的圆点。顶点数最多凸多边形是指由给定的圆点中的一部分组成的凸多边形,它包含最大可能的顶点数。原点,即坐标内中心(0,0)必须是顶点数最多凸多边形的一个顶点。
编写程序求出这样的凸多边形的最大顶点数。注意一个多边形的连续的边不能是平行的。
输入
输入文件的第一行包含一个自然数N,2≤N≤100,表示给定的圆点数。
下面的N行每行包含两个用空格隔开的自然数X和Y,1≤X≤100,1≤Y≤100,表示一个圆点的坐标值。所有的圆点是不相同的。
输出
输出文件的第一行也是唯一的一行应该包含顶点数最多凸多边形的顶点数。注意结果应不小于3。
样例
输入:
8
10 8
3 9
2 8
2 3
9 2
9 10
10 3
8 10
输出:
8
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstdio> 5 using namespace std ; 6 int n ; 7 struct id{ 8 int x , y ; 9 } pin[105] ; 10 int f[105][105] ; 11 12 bool cmp( id a , id b ) { 13 if( a.x * b.y < a.y * b.x ) return 1 ; 14 return 0 ; 15 } 16 17 int main ( ) { 18 // freopen( "10039.in" , "r" , stdin ) ; 19 // freopen( "10039.out" , "w" ,stdout ) ; 20 scanf( "%d" , &n ) ; 21 for( int x = 1 ; x <= n ; x++ ) scanf( "%d%d" , &pin[x].x , &pin[x].y ) ; 22 sort( pin + 1 , pin + 1 + n , cmp ) ; 23 for( int x = 1 ; x <= n ; x++ ) f[0][x] = 1 ; 24 for( int i = 1 ; i <= n ; i++ ) 25 for( int j = i+1 ; j <= n+1 ; j++ ) 26 for( int k = 0 ; k <= i-1 ; k++ ) { 27 int x ; 28 id a , b ; int tem ; 29 if( j == n+1 ) x = 0 ; 30 else x = j; 31 a.x = pin[i].x - pin[k].x, a.y = pin[i].y - pin[k].y; 32 b.x = pin[x].x-pin[i].x, b.y = pin[x].y - pin[i].y; 33 int c = a.x * b.y - b.x*a.y ; 34 if (c<0) f[i][x] = max( f[i][x], f[k][i]+1 ); 35 } 36 37 38 int ans = 0; 39 for ( int i = 0; i <= n; ++i ) 40 for ( int j2 = i+1; j2 <= n+1; ++j2 ) { 41 int j ; 42 if ( j2 == n+1 ) j = 0 ; else j = j2 ; 43 ans = max( ans, f[i][j] ) ; 44 } 45 printf("%d\n",ans); 46 return 0 ; 47 }
以上是关于凸多边形的最大顶点数的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2771 Guardian of Decency(最大独立集数=顶点数-最大匹配数)
Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)