题目链接: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

代码

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn=50+20;
  7. const double eps=1e-8, INF=1e9;
  8. struct Vector{
  9. double x, y;
  10. Vector(int x=0, int y=0):x(x), y(y) {}
  11. // no known conversion for argument 1 from 'Vector' to 'Vector&'
  12. Vector operator + (Vector p){return Vector(x+p.x, y+p.y);}
  13. Vector operator - (Vector p){return Vector(x-p.x, y-p.y);}
  14. Vector operator * (double k){return Vector(k*x, k*y);}
  15. Vector operator / (double k){return Vector(x/k, y/k);}
  16. bool operator < (Vector p) const{return (x==p.x)?(y<p.y):(x<p.x);}
  17. bool operator == (const Vector p) const{return fabs(x-p.x)<eps&&fabs(y-p.y)<eps;}
  18. double norm(void){return x*x+y*y;}
  19. double abs(void){return sqrt(norm());}
  20. double dot(Vector p){return x*p.x+y*p.y;}
  21. double cross(Vector p){return x*p.y-y*p.x;}
  22. };
  23. int x[maxn], y[maxn], n, T;
  24. double data[maxn][maxn];
  25. bool equal(double a, double b){
  26. return (a-b)<=eps && (b-a)<=eps;
  27. }
  28. double area(int i, int k, int j){
  29. Vector va(x[i]-x[j], y[i]-y[j]), vb(x[i]-x[k], y[i]-y[k]),
  30. vc(x[j]-x[k], y[j]-y[k]);
  31. double ans=abs(va.cross(vb));
  32. for (int idx=0; idx<n; idx++) if (idx!=i && idx!=k && idx!=j){
  33. double sum=0;
  34. Vector vec1(x[idx]-x[i], y[idx]-y[i]),
  35. vec2(x[idx]-x[j], y[idx]-y[j]);
  36. sum+=abs(vec1.cross(va));
  37. sum+=abs(vec1.cross(vb));
  38. sum+=abs(vec2.cross(vc));
  39. if (equal(sum, ans)) return INF;
  40. }return ans/2.0;
  41. }
  42. double dp(int i, int j){
  43. if (i+1==j) return 0;
  44. if (data[i][j]>0) return data[i][j];
  45. data[i][j]=INF;
  46. for (int k=i+1; k<=j-1; k++)
  47. data[i][j]=min(data[i][j],
  48. max(area(i, k, j), max(dp(i, k), dp(k, j))));
  49. // printf("%d, %d: %.1f\n", i, j, data[i][j]);
  50. return data[i][j];
  51. }
  52. int main(void){
  53. scanf("%d", &T);
  54. while (T--){
  55. scanf("%d", &n);
  56. for (int i=0; i<n; i++) scanf("%d%d", &x[i], &y[i]);
  57. for (int i=0; i<n; i++)
  58. for (int j=0; j<n; j++) data[i][j]=-1;
  59. printf("%.1f\n", dp(0, n-1));
  60. // int i, k, j;
  61. // while (scanf("%d%d%d", &i, &k, &j)==3)
  62. // printf("%.1f\n", area(i, k, j));
  63. }
  64. return 0;
  65. }
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. day09-1 列表,元祖的内置方法

    目录 列表类型的内置方法 作用 定义方式 方法 优先掌握 需要掌握 储存一个值or多个值 有序or无序?(有序:有索引, 无序:无索引) 可变or不可变(可变:值变id不变,不可变:值变id也变) 元 ...

  2. arttemplate模板引擎里面多层循环

    要使用支持原生js的插件: 代码截图: json数据 { "list": [ { "name": "学历层次", "item&qu ...

  3. Server初见——python

    import socketphone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1',8080))p ...

  4. [JZOJ]100047. 【NOIP2017提高A组模拟7.14】基因变异

    21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的变异息息相关,考察基因变 ...

  5. 2、使用Python3爬取美女图片-网站中的妹子自拍一栏

    代码还有待优化,不过目的已经达到了 1.先执行如下代码: #!/usr/bin/env python #-*- coding: utf-8 -*- import urllib import reque ...

  6. 如何解决zabbix中自定义监控mysql因密码造成的 Warning

    1.--show-warnings=false 在指定mysql命令获取参数时,指定不获取 Warning.不过亲测这个方法不是很有效 例如: mysql -uroot -p123 --show-wa ...

  7. tortoiseGit怎么记住密码

    tortoiseGit每次pull和push的时候都要输入git密码很是麻烦,下面是tortoiseGit记住密码的步骤 首先在你的项目界面右键 选择setting,这个步骤知识看一下你的名称和ema ...

  8. C#-WebService基础02

    WebService WSDL是web service的交换格式 跨平台数据交互 什么是web服务 SOA 面向服务的体系结构  service-Oriented Architecture Servi ...

  9. Apache Tez 0.7、0.83、 0.82 安装、调试笔记

    ———————————————————— 准备 Tez 编译环境 ———————————————————— 1 需要的支持 tez0.7 需要 Hadoop 2.60 以上 2 需要的 linux 相 ...

  10. 树莓派学习笔记—— 源码方式安装opencv

    0.前言     本文介绍怎样在树莓派中通过编译源码的方式安装opencv,并通过一个简单的样例说明怎样使用opencv.     很多其它内容请參考--[树莓派学习笔记--索引博文] 1.下载若干依 ...