Game of Taking Stones && POJ1259 /// 最大空凸包 几何+DP
题目大意:
给定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的更多相关文章
- POJ1259 The Picnic 最大空凸包问题 DP
POJ1259 给定平面上100个点 求一个最大的凸包,使得它不包含其中任意点,且凸包的顶点是题目所给的点. 枚举凸包左下角的点,顺时针枚举第二个点, 用opt[i][j]记录 i作为第二个点, 且第 ...
- hdu6219 Empty Convex Polygons (最大空凸包板子
https://vjudge.net/contest/324256#problem/L 题意:给一堆点,求最大空凸包面积. 思路:枚举凸包左下角点O,dp找出以这个点为起始位置能构成的最大空凸包面积, ...
- ZOJ 3537 Cake(凸包+区间DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...
- HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573 Problem Description Remember our childhood? A fe ...
- hdu6219(最大空凸包)
题意: 给一些点,求出一个最大的空凸包,这个凸包里没有任何给定点且要求这个凸包面积最大 分析: 枚举凸包左下角的点,然后dp[i][j]表示凸包的最后两条边是j->i和i->O情况下凸包的 ...
- 2017ACM/ICPC亚洲区沈阳站 C Hdu-6219 Empty Convex Polygons 计算几何 最大空凸包
题面 题意:给你一堆点,求一个最大面积的空凸包,里面没有点. 题解:红书板子,照抄完事,因为题目给的都是整点,所以最后答案一定是.5或者.0结尾,不用对答案多做处理 #include<bits/ ...
- UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...
- ZOJ 3537 Cake 求凸包 区间DP
题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...
- 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 ...
随机推荐
- 四:RF框架appium工具之xpath定位
XPATH定位方法具体的学会,还是在今年1月份,以前运用的都不熟练. 这个定位神器是一定要掌握的,不然有你抓狂的时候. 第一要掌握它的书写格式,这个好上手. 第二要掌握它的具体用法.这个就要多练习了, ...
- 【Javescript】DOM(文档对象模型)
1.定义: DOM是Document Object Model文档对象模型的缩写.是针对HTML和XML文档的一个API,通过DOM可以去改变文档. 例如:我们有一段HTML,那么如何访问第二层第一个 ...
- 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
目录 目录 前文列表 扩展阅读 前言 Models 模型 SQLAlchemy 安装 SQLAlchemy 安装 Mysql 建立 SQLAlchemy 和 Mysql 的连接 前文列表 用 Flas ...
- Perl 换行打印
#!/usr/bin/perl$, = "\t";$\ = "\n"; for($i=0;$i<3;$i++){ print("i: " ...
- PAT_A1092#To Buy or Not to Buy
Source: PAT A1092 To Buy or Not to Buy (20 分) Description: Eva would like to make a string of beads ...
- Asp.net Core + Log4net + ELK 搭建日志中心
原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ...
- 随笔-ansible-6
Ansible中的变量引用有时候需要双引号,有时候不需要双引号,这是因为Ansible是多人协作的作品,所以没有统一. 一切以官网说明为主,同时自己也要实践. 这是一个example.yml文件,我们 ...
- (转)Unity UI之GUI使用
一:GUI技术介绍 二:常见基础控件使用 三:GUILayout自动布局 四:GUI皮肤 一:GUI技术介绍 GUI技术看似成为古老的技术,但是Unity5.x之后并没有取消这种UI传统的技术.Uni ...
- selenium 自动下载文件
#coding=utf-8 from selenium import webdriver #实例化一个火狐配置文件 fp = webdriver.FirefoxProfile() #设置各项参数,参数 ...
- day01 python起源 介绍 解释器 变量 流程控制if
day01 python 一.python的起源 1.python简介 java 企业级应用, android, app c 操作系统, 做开发语言的, 游戏的内核 ...