zoukankan      html  css  js  c++  java
  • UVa 1331 最大面积最小的三角剖分

    https://vjudge.net/problem/UVA-1331

    题意:
    输入一个多边形,找一个最大三角形面积最小的三角剖分,输出最大三角形的面积。

    思路:

    最优三角剖分。

    dp[i][j]表示从i点到j点的最优值,枚举中间点k

    转移方程为dp[i][j]=min(dp[i][j],max(area(i,j,k),max(dp[i][k],dp[k][j])))

    如果三角形i-j-k中有其他的点,是不可以剖分的,需要去检验一下。

    可以看一下大神的题解,写得很详细。http://www.cnblogs.com/Konjakmoyu/p/4905563.html

     1 #include<iostream> 
     2 #include<algorithm>
     3 #include<string>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 const int maxn = 50 + 5;
     8 const int INF = 100000000;
     9 
    10 int n;
    11 int x[maxn], y[maxn];
    12 double d[maxn][maxn];
    13 
    14 //行列式求三角形面积
    15 double area(int a, int b, int c)
    16 {
    17     double s = (double)(1.0 / 2)*(x[a] * y[b] + x[b] * y[c] + x[c] * y[a] - x[a] * y[c] - x[b] * y[a] - x[c] * y[b]);
    18     if (s<0) return -s;
    19     return s;
    20 }
    21 
    22 //判断三角形内部是否有点
    23 bool check(int a, int b, int c)
    24 {
    25     int i;
    26     for (i = 1; i <= n; i++)
    27     {
    28         if (i == a || i == b || i == c) continue;
    29         double d = area(a, b, i) + area(a, c, i) + area(b, c, i) - area(a, b, c);
    30         if (d<0) d = -d;
    31         if (d <= 0.01) return 0;
    32     }
    33     return 1;
    34 }
    35 
    36 
    37 int main()
    38 {
    39     //freopen("D:\txt.txt", "r", stdin);
    40     int T;
    41     cin >> T;
    42     while (T--)
    43     {
    44         cin >> n;
    45         for (int i = 1; i <= n; i++)
    46             cin >> x[i] >> y[i];
    47         for (int i = n; i >= 1; i--)
    48         {
    49             d[i][i+1] = 0;
    50             for (int j = i + 2; j <= n; j++)
    51             {
    52                 d[i][j] = INF;
    53                 for (int k = i + 1; k < j; k++)
    54                 {
    55                     if (check(i, j, k))
    56                         d[i][j] = min(d[i][j], max(max(area(i, j, k), d[i][k]), d[k][j]));
    57                 }
    58             }
    59         }
    60         printf("%.1lf
    ", d[1][n]);
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    oracle循环语句
    解决使用Properties读取中文乱码问题
    oracle常用& to_date()怎么转换带am pm的时间格式
    distinct 多列详解
    javascript中遍历EL表达式List集合中的值
    最近一段时间代码汇总
    JAVA基础之对象的初始化
    求解圆圈中最后剩下的数字
    删除有序链表中的重复结点
    构造二叉树,并求解树的高度
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6371706.html
Copyright © 2011-2022 走看看