题目大意:

给定n个点 求出这n个点中最大空凸包的面积

只放个模板 一份模板过两题(滑稽

这个讲解够详细了 https://blog.csdn.net/nyroro/article/details/45268767

#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const double eps=1e-;
double add(double a,double b) {
if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
return a+b;
} // 考虑误差
int dcmp(double x) {
if(abs(x)<eps) return ;
else return x< ? -:;
}
struct P {
double x,y;
P(){};
P(double _x,double _y):x(_x),y(_y){}
P operator -(P p) { return P(add(x,-p.x),add(y,-p.y)); };
P operator +(P p) { return P(add(x,p.x),add(y,p.y)); };
P operator *(double d) { return P(x*d,y*d); };
double dot(P p) { return add(x*p.x,y*p.y); }; // 点积为0垂直
double det(P p) { return add(x*p.y,-y*p.x); }; // 叉积为0平行
void scf() { scanf("%lf%lf",&x,&y); }
}pa[], p[], O;
double lenV(P v) { return sqrt(v.dot(v)); }
bool cmp(P a,P b) {
int f=dcmp((a-O).det(b-O));
if(f==) return lenV(a-O)<lenV(b-O);
return f>;
} double dp[][], ans; void MEP(int n) {
sort(p,p+n,cmp);
memset(dp,,sizeof(dp));
for(int i=;i<n;i++) { // O-i 始终作为以st开始的凸包顺时针的第一条边
int j=i-;
while(j>= && dcmp((p[i]-O).det(p[j]-O))==) j--;
// i-j 作为凸包的第二条边
bool flag=(j==i-);
while(j>=) {
int k=j-;
while(k>= && dcmp((p[i]-p[k]).det(p[j]-p[k]))>) k--;
// 找到能作为凸包右下的一点的 k
double area=abs((p[i]-O).det(p[j]-O))/2.0;
if(k>=) area+=dp[j][k]; // 已求得的jk的MEP + 三角形Oij
if(flag) dp[i][j]=area; /// j!=i-1时不更新dp数组
/** 虽然对当前的凸包来说只是边界点没影响
但是之后其他凸包需利用当前dp[i][j]时
这些边界点会被包含在凸包内 */
ans=max(ans,area);
j=k;
}
if(flag)
for(int j=;j<i;j++)
dp[i][j]=max(dp[i][j],dp[i][j-]);
}
} int main()
{
int t; scanf("%d",&t);
while(t--) {
int n; scanf("%d",&n);
ans=;
for(int i=;i<n;i++) pa[i].scf();
for(int i=;i<n;i++) {
O=pa[i];
int c=;
for(int j=;j<n;j++)
if(pa[j].y>pa[i].y || dcmp(pa[j].y-pa[i].y)==&&pa[j].x>pa[i].x)
p[c++]=pa[j]; // 取O右上角的点
MEP(c); //printf("%.1f\n",ans);
}
printf("%.1f\n",ans);
} return ;
}

Game of Taking Stones && POJ1259 /// 最大空凸包 几何+DP的更多相关文章

  1. POJ1259 The Picnic 最大空凸包问题 DP

    POJ1259 给定平面上100个点 求一个最大的凸包,使得它不包含其中任意点,且凸包的顶点是题目所给的点. 枚举凸包左下角的点,顺时针枚举第二个点, 用opt[i][j]记录 i作为第二个点, 且第 ...

  2. hdu6219 Empty Convex Polygons (最大空凸包板子

    https://vjudge.net/contest/324256#problem/L 题意:给一堆点,求最大空凸包面积. 思路:枚举凸包左下角点O,dp找出以这个点为起始位置能构成的最大空凸包面积, ...

  3. ZOJ 3537 Cake(凸包+区间DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...

  4. HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573 Problem Description Remember our childhood? A fe ...

  5. hdu6219(最大空凸包)

    题意: 给一些点,求出一个最大的空凸包,这个凸包里没有任何给定点且要求这个凸包面积最大 分析: 枚举凸包左下角的点,然后dp[i][j]表示凸包的最后两条边是j->i和i->O情况下凸包的 ...

  6. 2017ACM/ICPC亚洲区沈阳站 C Hdu-6219 Empty Convex Polygons 计算几何 最大空凸包

    题面 题意:给你一堆点,求一个最大面积的空凸包,里面没有点. 题解:红书板子,照抄完事,因为题目给的都是整点,所以最后答案一定是.5或者.0结尾,不用对答案多做处理 #include<bits/ ...

  7. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  8. ZOJ 3537 Cake 求凸包 区间DP

    题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...

  9. ZOJ - 3537 Cake (凸包+区间DP+最优三角剖分)

    Description You want to hold a party. Here's a polygon-shaped cake on the table. You'd like to cut t ...

随机推荐

  1. Codeforces gym102222 B.Rolling The Polygon 凸包/余弦定理

    题意: 有一个不保证凸的多边形,让你滚一圈,计算某点滚出的轨迹多长. 题解: 求出凸包后,以每个点为转轴,转轴到定点的距离为半径,用余弦定理计算圆心角,计算弧长. #include<iostre ...

  2. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

  3. 在Linux下安装PyEmu

    git clone https://github.com/OpenRCE/pydbg.git git clone https://github.com/OpenRCE/paimei.git libda ...

  4. HDU 6693 Valentine's Day (概率)

    2019 杭电多校 10 1003 题目链接:HDU 6693 比赛链接:2019 Multi-University Training Contest 10 Problem Description O ...

  5. 【Java多线程系列六】Map实现类

    Map的一些实现类有及其特性 类 线程安全 特性 Hashtable 是 Key不能为null HashMap 否 读写效率最高,但在Java6多线程环境下使用不当可能陷入死循环,进而导致CPU使用率 ...

  6. laydate box-sizingCSS就会变形

    *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;/* box-sizing:border-box; */} 解决:在/laydat ...

  7. C# 简单的百度推送代码

    前段时间搞推送来着,安卓方面用到了百度的推送服务,由于只是简单的用到安卓推送的通知功能,所以没用百度推荐的C# SDK,通过借鉴网上的各种资料和百度的API,费了老大劲终于折腾出来一段能用的代码(早知 ...

  8. __new__构造方法

    """ 对象的创建过程:new创建 返回 模拟实例对象的创建过程. 为啥是静态方法? 先有new后来init.因为init是需要实例对象来调用的,需要一个实例对象和sel ...

  9. 前端必备,十大热门的 JavaScript 框架和库

    JavaScript 框架和库可以说是开源项目中最庞大也是最累的类目了,目前在github 上这一类的项目是最多的,并且几乎每隔一段时间就会出现一个新的项目席卷网络社区,虽然这样推动了创新的发展,但不 ...

  10. [原创]Delphi 字符串函数(字符串判断 TryStrToFloat 、TryStrToInt、TryStrToInt64、TryStrToBool、TryStrToCurr、TryStrToDate、TryStrToTime、TryStrToDateTime)

    引用单元SysUtils TryStrToFloat .TryStrToInt.TryStrToInt64.TryStrToBool.TryStrToCurr.TryStrToDate.TryStrT ...