题链:

http://poj.org/problem?id=1259

题解:

计算几何,凸包,DP

题意:给出N($N\leq100$)个点,求出最大的凸包使得凸包里面不存在点(边上可以有)。输出最大凸包的面积。


把所有点按x从小到大排序(若x相同则按y从小到大排序)。

依次枚举每个点p,把它作为凸包的左下角来计算此时可以形成的最大凸包。

做法如下:

将p号点作为原点,取出p+1~N的点(共m=N-p个点),对这m个点按极角逆时针排序。

然后定义DP状态:

f[j][i]:表示以i,j作为当前凸壳的最后两个点时的最大面积。(p<j<i)

转移:(S(j,i,p)表示j,i,p三个点形成的三角形)

f[j][i]=max(f[k][j])+S(j,i,p) (p<k<j且 $\vec{kj}\times\vec{ji}\geq0$,即要形成凸壳)

差不多就这样,然后注意细节就好了。(反正我是弄了好久才过样例的,233)

复杂度 $O(N^4)$

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
struct Point{
int x,y;
Point(int _x=0,int _y=0):x(_x),y(_y){}
void Read(){scanf("%d%d",&x,&y);}
}D[MAXN],Q[MAXN];
typedef Point Vector;
bool operator == (Point A,Point B){return A.x==B.x&&A.y==B.y;}
Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
int operator ^ (Vector A,Vector B){return A.x*B.y-A.y*B.x;}
int operator * (Vector A,Vector B){return A.x*B.x+A.y*B.y;}
int GL2(Vector A){//Get_Length^2
return A*A;
}
bool XYcmp(Point A,Point B){return A.x-B.x<0||(A.x-B.x==0&&A.y-B.y<0);}
bool PAcmp(Point A,Point B){return (A^B)>0||((A^B)==0&&GL2(A)<GL2(B));}
bool inTArea(Point P,Point A,Point B){//in_Triangle_Area
if(((B-A)^(P-A))<=0) return 0;
if((P^B)<=0||(P^A)>0) return 0;
return 1;
}
int F[MAXN][MAXN];
int DP(int m){
int ret=0;
memset(F,0,sizeof(F));
for(int i=1;i<=m;i++)
for(int j=1;j<i;j++)
for(int k=j+1;k<i;k++){
if(Q[k]==Q[i]||Q[k]==Q[j]) continue;
if(!inTArea(Q[k],Q[j],Q[i])) continue;
F[j][i]=-INF;break;
}
for(int i=1;i<=m;i++)
for(int j=1;j<i;j++) if(!F[j][i]){
F[j][i]=Q[j]^Q[i]; int tmp=0;
for(int k=j-1;k;k--){
if(((Q[j]-Q[k])^(Q[i]-Q[j]))>=0) tmp=max(tmp,F[k][j]);
if(!(Q[k]^Q[j])) break;
}
F[j][i]+=tmp;
ret=max(ret,F[j][i]);
}
return ret;
}
int work(int n){
int m,ret=0;
sort(D+1,D+n+1,XYcmp);
for(int i=1;m=0,i<=n;i++){
for(int j=i+1;j<=n;j++) Q[++m]=D[j];
for(int j=1;j<=m;j++) Q[j]=Q[j]-D[i];
sort(Q+1,Q+m+1,PAcmp);
ret=max(ret,DP(m));
}
return ret;
}
int main(){
int Case,n; double ans;
for(scanf("%d",&Case);Case;Case--){
scanf("%d",&n);
for(int i=1;i<=n;i++) D[i].Read();
ans=1.0*work(n)/2;
printf("%.1lf\n",ans);
}
return 0;
}

  

●POJ 1259 The Picnic的更多相关文章

  1. poj 1259 Agri-Net(最小生成树)

    题目:http://poj.org/problem?id=1258 题意:模板题 和2485差不多 就是求相连后的最小值. #include <iostream> #include< ...

  2. 【POJ 1639】 Picnic Planning (最小k度限制生成树)

    [题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...

  3. POJ 3256 Cow Picnic

    Cow Picnic Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4928   Accepted: 2019 Descri ...

  4. Picnic Planning POJ - 1639(最小k度生成树)

    The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible abil ...

  5. POJ 1639 Picnic Planning 最小k度生成树

    Picnic Planning Time Limit: 5000MS   Memory Limit: 10000K Total Submissions:11615   Accepted: 4172 D ...

  6. POJ 1639 Picnic Planning(最小度限制生成树)

    Description The Contortion Brothers are a famous set of circus clowns, known worldwide for their inc ...

  7. POJ 1639 Picnic Planning:最小度限制生成树

    题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...

  8. [POJ 1639] Picnic Planning

    [题目链接] http://poj.org/problem?id=1639 [算法] 首先,我们可以用深度优先遍历求出1号节点去除后有几个联通块 设共有T个联通块,若T > K则无解,否则 : ...

  9. poj 1639 Picnic Planning 度限制mst

    https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...

随机推荐

  1. 实验四Java Android简易开发

    实验准备 Android Studio下载 Android Studio安装 实验内容 Android Stuidio的安装测试 Android Stuidio的安装测试: 参考<Java和An ...

  2. 20162318 实验三《 敏捷开发与XP实践》实验报告

    北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年5月12日 实验密级:非密级 实验器材:带Lin ...

  3. Beta冲刺 第一天

    Beta冲刺 第一天 1. 昨天的困难 由于今天还是第一天,所以暂时没有昨天的困难. 2. 今天解决的进度 潘伟靖: 对代码进行了review 1.将某些硬编码改为软编码 2.合并了一些方法,简化代码 ...

  4. C语言——第六周作业

    题目 题目一:高速公路超速处罚 1.实验代码 #include <stdio.h> int main() { int speed,maxspeed; double x; scanf(&qu ...

  5. NOIP2016 天天爱跑步 80分暴力

    https://www.luogu.org/problem/show?pid=1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养 ...

  6. VS2013 重装 无法打开项目

    今天遇到的奇葩BUG,耗时我一下午,现在跟大家说道说道. 今天重装系统,让各种开发环境开发工具自然要重装一次,最后装完VS2013,然后刚好客户打电话要改点东西,然后我就双击项目准备打开改,然后奇葩来 ...

  7. JAVA_SE基础——17.方法的重载

    方法重载: 方法重载就是方法名称重复,加载参数不同. 具体规范: 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类 ...

  8. JAVA_SE基础——编码规范&代码编写规则

    这次我来给大家说明下编码规范&代码编写规则  ↓ 编码规范可以帮助程序员在编程时注意一些细节问题,提高程序的可读性,让程序员能够尽快地理解新的代码,并帮助大家编写出规范的利于维护的Java代码 ...

  9. Python内置函数(64)——classmethod

    英文文档: classmethod(function) Return a class method for function. A class method receives the class as ...

  10. 安装 go 语言环境

    操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 安装go 这里直接安装二进制,其它方式请自行搜索. 1.下载并安装go 命令如下: ? 1 2 3 wget https://st ...