题目大意:

给定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. HDU 6651 Final Exam (思维)

    2019 杭电多校 7 1006 题目链接:HDU 6651 比赛链接:2019 Multi-University Training Contest 7 Problem Description Fin ...

  2. python:Django 简介。

    Django是基Python的重要WEB框架. 1.安装Django Web框架 安装  pip 安装 在命令行模式 执行  [pip install django == 2.0]或者 [pip in ...

  3. Centos7下Firewalld防火墙配置命令

    前    言 服务端口日常被拦截,记录一下常用的命令便于查询 Firewalld服务管理 查看防火墙状态   1 systemctl status firewalld 开机启用/禁用防火墙   1 s ...

  4. 【Linux】- 守护进程的启动方法

    转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ...

  5. 34-Ubuntu-用户权限-05-超级用户

    超级用户 Linux系统中的root(超级用户)账号通常用于系统的维护和管理,对操作系统的所有资源具有访问的权限. 在大多数的Linux版本中,都不推荐直接使用root账号登录系统. 在Linux安装 ...

  6. Linux初学习之 rm 命令

    现在我们来仔细的学习一下linux的rm命令,这个命令顾名思义(我猜的,嘻嘻,是remove) 命令格式: rm [OPTION]... FILE... Remove (unlink) the FIL ...

  7. Flyway - Version control for your database

    Flyway 是什么? Flyway是个数据库版本管理工具.在开发过程中,数据库难免发生变更,例如数据变更,表结构变更.新建表或者视图等等. 在项目进行时无法保证一旦开发环境中的数据库内容变化候会去测 ...

  8. 将Java和Javac的命令在控制台的输出重定向到txt文件

    当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...

  9. grunt中调用webpack

    项目中一些很老的技术需要运用webpack管理,这时候必须使用grunt+webpack 配合使用 .做个笔记,不限多说直接上代码 grunt结合webpack 下面是 Gruntfile.js co ...

  10. B 树 B+树

      拜读了 http://blog.csdn.net/v_july_v/article/details/6530142, 自己总结下: B树的出发点是为了解决磁盘IO慢的问题,尽量再一个磁盘块中提供更 ...