题链:

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. 201621123035 《Java程序设计》第1周学习总结

    1.本周学习总结 本周学习内容:Java平台概论.认识JDK规范与操作.了解JVM.JRE与JDK.撰写Java原始码.path是什么 关键词:JVM.JRE.JDK 联系:JVM是Java虚拟机的缩 ...

  2. 201621123040《Java程序设计》第六周学习总结

    1.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结 2.书面作业 2.1clone方法 2.1.1在te ...

  3. Tornado 用户身份验证框架

    1.安全cookie机制 import tornado.web session_id = 1 class MainHandler(tornado.web.RequestHandler): def ge ...

  4. Android webview Mixed Content无法显示图片解决

    转自:http://blog.csdn.net/crazy_zihao/article/details/51557425 前言 在使用WebView加载https资源文件时,如果认证证书不被Andro ...

  5. vue mint-ui 三级地址联动

    我也是第一次写这种地址联动的 刚开始的时候 我还以为直接用select来写 后来公司的ios告知并不是这样的 他说应该时这样的 于是第一想法 赶紧找插件吧 但是找了一会未果  就问了公司大神 他刚开始 ...

  6. Ubuntu Desktop 16.04 LTS 下成功配置Jupyter的两个python内核版本(2.7x,3.5x)

    Ubuntu  Desktop 16.04 LTS 安装好系统默认就有python两个不同版本(2.7.12和3.5.2) 现在来熟悉一下jupyter的对python这两个不同python版本的内核 ...

  7. 分布式版本控制系统Git的安装及使用

    Git的安装分为客户端安装和服务端安装,鉴于我平时码代码在windows环境下,因此本文客户端安装直接在windows环境,服务端安装在linux环境下(centos). Git客户端安装 客户端下载 ...

  8. build.gradle & gradle.properties

    一.build.gradle buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { cred ...

  9. Docker加速器(阿里云)

    1. 登录阿里开发者平台: https://dev.aliyun.com/search.html,https://cr.console.aliyun.com/#/accelerator,生成专属链接 ...

  10. SpringMVC(九):SpringMVC 处理输出模型数据之ModelAndView

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...