题目大意:

给定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. 互斥锁Demo

    #include <stdio.h> #include <pthread.h> pthread_t work1Id; pthread_t work2Id; ; ; pthrea ...

  2. python中的缓存技术

    python缓存技术 def console(a,b): print('进入函数') return (a,b) print(console(3,'a')) print(console(2,'b')) ...

  3. C++的模板

    1. 模板形参表 模板形参表,里面可以是typename T/ class T这种形式的,代表里面被泛化的是一种类型: 也可以使用Type value这种形式的,代表里面被泛化的是一个某种类型的值. ...

  4. 拾遗:关于“尾递归”- tail recursion

    定义[个人理解]: 尾递归,即是将外层得出的常量计算因子,以函数参数的形式逐层向内传递,即内层调用整合外层调用的产出,整个递归的结果最终由最内层的一次函数调用得出:而通常的递归则是外层调用阻塞.等待内 ...

  5. 拾遗:btrfs

    #扫描 btrfs 文件系统btrfs device scan btrfs device scan /dev/sda #创建子卷或快照 btrfs subvolume create /mnt/btrf ...

  6. CM 安装CDH 错误: 安装失败。 无法接收 Agent 发出的检测信号。

    在安装CDH的时候出现错误提示: 安装失败. 无法接收 Agent 发出的检测信号. 日志提示错误: start >> raise socket.error(msg) >>er ...

  7. C# Winform Dev控件之TileControl

    tileControl 包含TileGroup TileGroup 包含 Tile Tile拖拽时代码 TilteControl的itemPress事件执行 或Tile的itemPress执行 Til ...

  8. 2019牛客国庆集训派对day7 A 2016

    链接:https://ac.nowcoder.com/acm/problem/52800来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  9. 净心诀---python3生成器

    生成器的作用----减少程序运行的内存开销 生成器特点: 1.一个一个的取值,而不是一次性把所有数据创建出来,迭代器中的数据不取不创建2.只能按照顺序取,不能跳过也不能回头3.一个迭代器中的数据只能从 ...

  10. Ubuntu安装mongo可视化工具

    一.robo 3T 是mongodb的一个非常好用的可视化管理工具,曾经名为robomongo,现在被收购后改名为robo 3T.且现在robo 3T 1.1版本能支持mongodb3.4.现在在Ub ...