UVA1331 Minimax Triangulation

原创 2018年04月15日 15:25:52

Address


Description

  • 给定一个 n 条边的多边形(不一定是凸多边形),用 n3 条线段(线段必须连接多边形上的两点,每条线段都必须在多边形的内部,并且任意两条线段都不能在多边形内相交)把多边形剖分成 n2 个三角形,试找出一个切割方案,使得最大的三角形面积最小。

Input

  • 第一行一个整数 T 表示数据组数。
  • 每组数据的第一行一个整数 n
  • 接下来 n 行,按顺时针或逆时针顺序给出 n 边形的一个点 (x,y)

Output

  • 一个实数,表示最大面积,保留1位小数。

Sample Input

  • 6
    7 0
    6 2
    9 5
    3 5
    0 3
    1 1

Sample Output

  • 9.0

Solution

  • 先把点统一处理成逆时针顺序(若用叉积算多边形面积为负数则为顺时针)。
  • f[l][r] 表示从多边形上第 l 个点 Al 到第 r 个点 Ar 之间的区域全部分割成三角形后,最大三角形面积的最小值。
  • 注意因为多边形首尾顺次相接,l 可以大于 r
  • nxt[i]=i+1(1i<n),nxt[n]=1,则 DP 边界为 f[i][nxt[i]]=0
  • 转移为:f[l][r]=min{max{f[l][i], SAlAiAr, f[i][r]}}(AiAr×AiAr>0)
  • 注意题目给出的多边形不一定是凸多边形,可能存在如下情况:
  • 此时 AlAiAr 是不合法的,但同时我们也会发现用叉积计算结果为负数,因此 DP 就只要判断 AiAr×AiAr>0
  • 最后答案为 min{max{f[i][j], f[j][i]}}(ij)
  • 转移顺序不好处理,可用记忆化搜索实现。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int Maxn = 0x3f3f3f3f;
const int N = 55;
int nxt[N], f[N][N], n, m, Ans;

struct point
{
    int x, y;

    point() {}
    point(int X, int Y):
        x(X), y(Y) {}

    friend inline point operator - (const point &a, const point &b) 
    {
        return point(b.x - a.x, b.y - a.y); 
    }

    friend inline int operator * (const point &a, const point &b)
    {
        return a.x * b.y - b.x * a.y;
    }
}a[N];

inline int Max(int x, int y) {return x > y ? x : y;}
inline int Min(int x, int y) {return x < y ? x : y;}
inline void CkMin(int &x, int y) {if (x > y) x = y;}

inline int dp(int l, int r)
{
    if (f[l][r] != -1) return f[l][r];
    if (r == nxt[l]) return f[l][r] = 0;
    int res = Maxn;
    for (int i = nxt[l]; i != r; i = nxt[i])
    {
        int tmp = (a[i] - a[r]) * (a[i] - a[l]);
        if (tmp > 0) CkMin(res, Max(Max(dp(l, i), tmp), dp(i, r)));
    }
    return f[l][r] = res;
}

int main()
{
    while (scanf("%d", &m) != EOF) 
    {
        while (m--) 
        { 
            scanf("%d", &n);
            for (int i = 1; i <= n; ++i) 
                scanf("%d%d", &a[i].x, &a[i].y);
            for (int i = 1; i < n; ++i)
                nxt[i] = i + 1; nxt[n] = 1;
            int sum = 0; 
            for (int i = 1; i < n; ++i)
                sum += a[i] * a[i + 1]; sum += a[n] * a[1];
            if (sum < 0)
                for (int i = 1, im = n >> 1; i <= im; ++i) 
                    swap(a[i], a[n - i + 1]);

            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                    f[i][j] = -1;
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)    
                    if (i != j) dp(i, j);
            Ans = Maxn;
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                    if (i != j) CkMin(Ans, Max(f[i][j], f[j][i]));
            printf("%.1lf\n", (double)Ans / 2.0);
        }
    }
    return 0;
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bzjr_Log_x/article/details/79949661

彻底掌握 Javascript(十九)Iterator 迭代器【专家辅导】

ES6 引入了 Iterator 迭代器,这是很重要的特性,所有相关javascript的类,都实现了这个接口,从而可以利用 for-of 来循环,具体的看课程吧,很有用的特性。
  • 2017年06月30日 20:59

bzoj4449 [Neerc2015]Distance on Triangulation

Description 给定一个正 n 边形及其三角剖分, 共 2n − 3 条边 (n 条多边形的边和 n − 3 条对角线), 每条边的长度为 1. 共 q 次询问, 每次询问给定两个点,...
  • jpwang8
  • jpwang8
  • 2018-04-01 12:21:44
  • 50

hznu 1139: Minimax Triangulation(dp,三角形面积模板)

Triangulation of surfaces has applications in the Finite Element Method of solid mechanics. The obje...
  • cacyth
  • cacyth
  • 2015-06-13 22:43:12
  • 483

uva 1331 Minimax Triangulation

给出一个多边形求三角分割使分割得到的最大三角形最小。可以是凹多边形,这一点比较坑~~ 区间dp,跟最优三角剖分差不多, 状态转移:dp[j][j + i] = min(dp[j][j + i...
  • sheng4204
  • sheng4204
  • 2016-07-05 17:17:32
  • 216

1331 - Minimax Triangulation(DP)

该题就是最优三角形剖分的变形,虽然要用到一些几何知识,但是我们可以将其区间化,让决策变得有序 。  这样就变成了区间问题 。  我们定义d[i][j]表示由i~j顶点组成的子多边形的最优解,那么不难写...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015-07-12 20:50:07
  • 673

uva 1331——Minimax Triangulation

题意:三角刨分,把一个m边形分解成m-2个三角形,求一个最大三角形最小的刨分,输出最小的那个三角形面积。 思路:递推。可能需要一点几何思维,d(i,j)为多边形的最优解,则d(i,j)=mi...
  • bobodem
  • bobodem
  • 2015-12-06 22:28:56
  • 409

例题9-11 最大面积的最小的三角剖分 UVa1331

1.题目描述:点击打开链接 2.解题思路:本题属于“最优三角剖分”型的dp,设d(i,j)表示子多边形i,i+1,...,j-1(i d(i,j)=min(S(i,j,k),max(d(i,k),...
  • u014800748
  • u014800748
  • 2015-08-24 00:28:19
  • 1216

UVA 1331 Minimax Triangulation 区间DP

区间DP: 将一个多边形三角剖分,让可以得到的最大三角形的面积最小 dp[i][j]表示从i点到j点的最优值,枚举中间点k dp[i][j]=min(dp[i][j],max(area(i...
  • u012797220
  • u012797220
  • 2015-02-12 18:05:34
  • 1064

dp uva1331最大面积最小三角形剖分

题意不多说 题解: 这道题的dp题非常好,方程式的定义看似简单,但其实很难想到 dp[i][j]表示编号从i到j的点构成的多边形中的最大三角形面积 注意到这一点,这个图是封闭的,也就是一个环状...
  • qq_37816449
  • qq_37816449
  • 2017-07-19 08:51:30
  • 70

UVA 最大面积最小三角形剖分

点击打开题目题目大意: 以顺时针或逆时针给出一个简单多边形的n个点的坐标,用n-2条互不相交的,且与边不相交的对角线,分成n-2个三角形,要求其中最大三角形的面积最小开始还汪星人咬乌龟,无从下口,但...
  • C20182024
  • C20182024
  • 2017-07-19 21:35:23
  • 138
收藏助手
不良信息举报
您举报文章:UVA1331 Minimax Triangulation
举报原因:
原因补充:

(最多只允许输入30个字)