题链:

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. C语言嵌套循环

    题目一:7-3 编程打印空心字符菱形 1.提交列表 2.设计思路: 1.定义整型变量循环控制变量i,j,k,x,y,z,e及菱形的高度height: 2.定义字符型变量letter: 3.输入字符型变 ...

  2. Python实现基于协程的异步爬虫

    一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python ...

  3. python functools.lru_cache做备忘功能

    import time import functools def clock(func): @functools.wraps(func)#还原被装饰函数的__name__和__doc__属性 def ...

  4. Flask 扩展 HTTP认证

    Restful API不保存状态,无法依赖Cookie及Session来保存用户信息,自然也无法使用Flask-Login扩展来实现用户认证.所以这里,我们就要介绍另一个扩展,Flask-HTTPAu ...

  5. WPF自学入门(十)WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...

  6. caffe实现GAN

    我实现GAN网络结构比较复杂: 通过建立两个一模一样的网络,他们相对应的层共享权重,一个网络用来跟新D model另一个网络用来更新G model 更新G model的网络,D部分只进行梯度传递,不进 ...

  7. 解决java.lang.NoSuchMethodError:org.joda.time.DateTime.withTimeAtStartOfDay() Lorg/joda/time/DateTime

    问题:项目放在weblogic运行,报错 java.lang.NoSuchMethodError: org.joda.time.DateTime.withTimeAtStartOfDay()Lorg/ ...

  8. 第四篇:用IntelliJ IDEA 搭建基于jersey的RESTful api

    编译器:Intellij IDEA 系统环境: MAC OS 相关技术:Maven.tomcat 7.jdk8 1.创建项目 首先创建一个web Application项目(这里我们打算用maven引 ...

  9. django三种文件下载方式

    一.概述 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. ...

  10. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...