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 ...
随机推荐
- go routine
无缓冲 channel 是在多个 goroutine 之间同步很棒的工具. 当在 Go 中用 ch := make ( chan bool ) 创建 chennel 时,bool 型的 无缓冲 cha ...
- Ubuntu下安装Samba服务器
闲来无聊尝试自己安装下Samba服务器,使本机和虚拟机可以无障碍传输文件(虽然用VMwaretools可传,但总感觉麻烦,而且速度欠佳) 首先,同安装qemu一样,在安装之前要确定你的系统apt列表已 ...
- 使用ansible远程管理集群
使用ansible远程执行命令 1.ansible简介 ansible的官方定义:"Ansible is Simple IT Automation"--简单的自动化IT工具.这个工 ...
- 线程创建后为什么要调用CloseHandle
很多程序在创建线程都这样写的: ............ ThreadHandle = CreateThread(NULL,0,.....); CloseHandel(ThreadHandle ); ...
- python调用tushare获取IPO新股上市列表数据
接口:new_share 描述:获取新股上市列表数据 限量:单次最大2000条,总量不限制 积分:用户需要至少120积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare包下载和初始化教 ...
- P3224 [HNOI2012]永无乡(平衡树合并)
题目描述 永无乡包含 nn 座岛,编号从 11 到 nn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nn 座岛排名,名次用 11 到 nn 来表示.某些岛之间由巨大的桥连接,通过桥可以从 ...
- C语言指针变量的长度
#include <stdio.h> int main() { /********************************************* * * 指针的长度:不同机器可 ...
- Web开发常规调试方法与常见问题分析
一.Web项目基本原理 现在的web项目大都已经前后端独立开发与部署. 前后端独立开发,一般是前端与后端通过web接口(常见的有RESTful与websocket)文档进行交流.前端开发人员先更具业务 ...
- ARM 汇编 简单介绍
1. 汇编文件说明 : 汇编文件以 [.s]结尾的文件格式 注释:多行注释 /* */ : 单行注释 @ 2. 符号说明: 1) 汇编指令,一条指令对应一个机器码,完成一定的功能 2) 伪指令, ...
- 文件IO 例子
例子1: 测试最多打开多少个文件 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> # ...