题目链接:https://cn.vjudge.net/problem/UVA-1331

题意

给一个任意多边形,把它分为多个三角形。

求某方案中最大的三角形是各方案中最小的面积的三角形面积。

思路

学了三角剖分了,看到这题可以顺手写下状态,转移方程可以观察目标函数(单个三角形面积)得出。

\[dp[i][j] = min(dp[i][j], max(Area[i][k][j], dp[i][k], dp[k][j]) )
\]

还有一个关键点,就是判断选定的三角形是否可行。

本题里如果选定的三角包含了某点,就算是不可行的。

具体图见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 计算几何 三角剖分 最大三角形最小化的更多相关文章

  1. UVA - 1331 Minimax Triangulation (区间dp)(最优三角剖分)

    题目链接 把一个多边形剖分成若干个三角形,使得其中最大的三角形面积最小. 比较经典的一道dp问题 设dp[l][r]为把多边形[l,r]剖分成三角形的最大三角形面积中的最小值,则$dp[l][r]=m ...

  2. Uva 1331 - Minimax Triangulation(最优三角剖分 区间DP)

    题目大意:依照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. 思路:用区间DP能够非常方便解决,多边形可能是凹边形, ...

  3. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

  4. UVa 1331 - Minimax Triangulation(区间DP + 计算几何)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  6. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

  7. uva 10003 Cutting Sticks(区间DP)

    题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...

  8. UVa 1632 阿里巴巴(区间DP)

    https://vjudge.net/problem/UVA-1632 题意: 直线上有n个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba可以从任意位置出发,求访问完所有点的最短 ...

  9. uva 10739【基础(区间)dp】

    Uva 10739 题意:给定字符串,可以增加.删除.修改任意字符,问最少经过多少次操作使字符串回文. 题解:定义dp[l][r]表示把从l到r的子串Sl...Sr变成回文串需要操作的最少次数.字符可 ...

随机推荐

  1. Console.WriteLine 不会输出到unity控制台

    1,Console.WriteLine() 是输出到控制台程序(console application)的命令 2,Unity中控制台是一个独立的程序,要想输出到Unity控制台需要使用Debug.L ...

  2. HDU 2303 The Embarrassed Cryptographer

    The Embarrassed Cryptographer 题意 给一个两个素数乘积(1e100)K, 给以个数L(1e6), 判断K的两个素数是不是都大于L 题解 对于这么大的范围,素数肯定是要打表 ...

  3. easyUI在使用字符串拼接时样式不起作用,点击加号增加一行,点击减号删除一行效果。

    拼接的按钮没有样式,需要使用 var str = $("<a href='javascript:void(0)' class='easyui-linkbutton' onclick=' ...

  4. [置顶] 谷歌大牛 Jeff Dean 是如何成为互联网战神的

    谷歌大牛 Jeff Dean 是如何成为互联网战神的 原文链接: Will Oremus   翻译: 伯乐在线- Lex Lian 译文链接: http://blog.jobbole.com/4772 ...

  5. cf掉分记——Avito Code Challenge 2018

    再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: ...

  6. MySQL主从宕机的解决方法

    测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...

  7. laydate 监听日期切换

    ```` //日期范围 laydate.render({ elem: '#Time', range: "至", max: gitData() ,done: function(val ...

  8. python基础知识部分练习大全

    python基础知识部分练习大全   1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行 ...

  9. Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password

    在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w jmxremote.password ,放开角色信息那俩行的注释,保存,再使用c ...

  10. oauth2.0里回调地址返回code中如何让code不显示在URL里?

    背景: 最近在调用对方提供的oauth2.0接口的时候,返回code在URL显示,但是会影响到本系统调用其他的菜单项的操作,所以想把返回的code值去掉. 解决办法:     想了各种解决办法,目前把 ...