P2924 [USACO08DEC]大栅栏Largest Fence

传送门

反正我是看不出来这题和凸包有什么关系……大佬们是怎么想到的……
不准确一点的说,本题就是要我们求一个边上点数最多的凸包
我们可以先把所有的边都取出来,然后按极角排序。枚举这个凸包的起点,然后做dp即可
复杂度\(O(n^3)\)

//minamoto
#include<bits/stdc++.h>
#define rint register int
using namespace std;
const int N=305;
struct node{int u,v;double x,y;}p[N],e[N*N];int f[N];
inline bool cmp(node a,node b){return atan2(a.x,a.y)<atan2(b.x,b.y);}
int main(){
//	freopen("testdata.in","r",stdin);
	int n,tot=0,ans=0;scanf("%d",&n);
	for(rint i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
	for(rint i=1;i<=n;++i)for(rint j=1;j<=n;++j)if(i!=j){
		e[++tot]={i,j,p[j].x-p[i].x,p[j].y-p[i].y};
	}sort(e+1,e+1+tot,cmp);
	for(rint i=1;i<=n;++i){
		memset(f,0xef,sizeof(f));f[i]=0;
		for(rint j=1;j<=tot;++j)
		f[e[j].v]=max(f[e[j].v],f[e[j].u]+1);
		ans=max(ans,f[i]);
	}printf("%d\n",ans);return 0;
}
posted @ 2018-11-20 15:45  bztMinamoto  阅读(287)  评论(0编辑  收藏  举报
Live2D