UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化
题目链接:https://cn.vjudge.net/problem/UVA-1331
题意
给一个任意多边形,把它分为多个三角形。
求某方案中最大的三角形是各方案中最小的面积的三角形面积。
思路
学了三角剖分了,看到这题可以顺手写下状态,转移方程可以观察目标函数(单个三角形面积)得出。
\]
还有一个关键点,就是判断选定的三角形是否可行。
本题里如果选定的三角包含了某点,就算是不可行的。
具体图见uva 1331 - Minimax Triangulation(dp) @JeraKrs
提交过程
| WA | 修改double INF=1e9,还有一块向量的计算写错j和k |
代码
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50+20;
const double eps=1e-8, INF=1e9;
struct Vector{
double x, y;
Vector(int x=0, int y=0):x(x), y(y) {}
// no known conversion for argument 1 from 'Vector' to 'Vector&'
Vector operator + (Vector p){return Vector(x+p.x, y+p.y);}
Vector operator - (Vector p){return Vector(x-p.x, y-p.y);}
Vector operator * (double k){return Vector(k*x, k*y);}
Vector operator / (double k){return Vector(x/k, y/k);}
bool operator < (Vector p) const{return (x==p.x)?(y<p.y):(x<p.x);}
bool operator == (const Vector p) const{return fabs(x-p.x)<eps&&fabs(y-p.y)<eps;}
double norm(void){return x*x+y*y;}
double abs(void){return sqrt(norm());}
double dot(Vector p){return x*p.x+y*p.y;}
double cross(Vector p){return x*p.y-y*p.x;}
};
int x[maxn], y[maxn], n, T;
double data[maxn][maxn];
bool equal(double a, double b){
return (a-b)<=eps && (b-a)<=eps;
}
double area(int i, int k, int j){
Vector va(x[i]-x[j], y[i]-y[j]), vb(x[i]-x[k], y[i]-y[k]),
vc(x[j]-x[k], y[j]-y[k]);
double ans=abs(va.cross(vb));
for (int idx=0; idx<n; idx++) if (idx!=i && idx!=k && idx!=j){
double sum=0;
Vector vec1(x[idx]-x[i], y[idx]-y[i]),
vec2(x[idx]-x[j], y[idx]-y[j]);
sum+=abs(vec1.cross(va));
sum+=abs(vec1.cross(vb));
sum+=abs(vec2.cross(vc));
if (equal(sum, ans)) return INF;
}return ans/2.0;
}
double dp(int i, int j){
if (i+1==j) return 0;
if (data[i][j]>0) return data[i][j];
data[i][j]=INF;
for (int k=i+1; k<=j-1; k++)
data[i][j]=min(data[i][j],
max(area(i, k, j), max(dp(i, k), dp(k, j))));
// printf("%d, %d: %.1f\n", i, j, data[i][j]);
return data[i][j];
}
int main(void){
scanf("%d", &T);
while (T--){
scanf("%d", &n);
for (int i=0; i<n; i++) scanf("%d%d", &x[i], &y[i]);
for (int i=0; i<n; i++)
for (int j=0; j<n; j++) data[i][j]=-1;
printf("%.1f\n", dp(0, n-1));
// int i, k, j;
// while (scanf("%d%d%d", &i, &k, &j)==3)
// printf("%.1f\n", area(i, k, j));
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 10ms | None | 2245 | C++ 5.3.0 | 2018-08-08 08:00:44 |
UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化的更多相关文章
- UVA - 1331 Minimax Triangulation (区间dp)(最优三角剖分)
题目链接 把一个多边形剖分成若干个三角形,使得其中最大的三角形面积最小. 比较经典的一道dp问题 设dp[l][r]为把多边形[l,r]剖分成三角形的最大三角形面积中的最小值,则$dp[l][r]=m ...
- Uva 1331 - Minimax Triangulation(最优三角剖分 区间DP)
题目大意:依照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. 思路:用区间DP能够非常方便解决,多边形可能是凹边形, ...
- uva 1331 - Minimax Triangulation(dp)
option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...
- UVa 1331 - Minimax Triangulation(区间DP + 计算几何)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
- uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...
- UVa 1632 阿里巴巴(区间DP)
https://vjudge.net/problem/UVA-1632 题意: 直线上有n个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba可以从任意位置出发,求访问完所有点的最短 ...
- uva 10739【基础(区间)dp】
Uva 10739 题意:给定字符串,可以增加.删除.修改任意字符,问最少经过多少次操作使字符串回文. 题解:定义dp[l][r]表示把从l到r的子串Sl...Sr变成回文串需要操作的最少次数.字符可 ...
随机推荐
- Java基础——Servlet
什么是Servlet Servlet是Java Web的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: l ...
- 设置mySql的编码方式为utf-8
检查命令: mysql> show variables like '%char%'; 期望结果: 使用mysql命令设置: 如果仍有编码不是utf8的,请检查配置文件,也可使用mysql命令设置 ...
- [分享]前端javascript插件(均开源)
记录并分享一些自己使用过的插件,便于以后有相应的功能需要使用可以及时想到. 1:数字插件countUp.js 功能:用于动态显示数字的增加和减少 项目github地址:http://inorganik ...
- react-redux源码解析(资料)
资料:https://www.cnblogs.com/hhhyaaon/p/5863408.html 感觉很棒,记录一下
- 安装node-sass及报错后解决方案
使用npm install 命令安装node-sass时,经常出现安装失败的情况.原因在于npm服务器在美国,还有就是某强大的防火墙作用.导致模块无法下载. 1 npm install node-sa ...
- HDU 1042 N!( 高精度乘法水 )
链接:传送门 思路:高精度乘法板子题,高精度耗时又耗空间...... /**************************************************************** ...
- Linux进程僵死原因排查思路
常情况下脚本执行时间几秒完成,如果超过很长时间执行完成,可能是进程等待某些资源引起阻塞(假死状态). 场景:xx.perl读取文件并发送邮件 现象:执行脚本的进程僵死(卡住) 排查:ps -ef |g ...
- python3编写登录接口
#/usr/bin/env python#yehui'''作业一:博客 作业二:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定'''import getpass, os, pic ...
- crm 系统项目(二) admin 后台操作表格
crm 系统项目(二) admin 后台操作表格 1. app下创建 templates 运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. ...
- MRv2 工作机制 、 公平调度器、MR压缩、边数据
对于节点数超过 4000 的大型集群,前一节描述的 MapReduce 系统开始面临着扩展的瓶颈. 2010 年 Yahoo 的团队开始设计下一代的 MapReduce. (Yet Another R ...