zoukankan      html  css  js  c++  java
  • ZOJ2227Minimax三角划分

    Despription

    Triangulation of surfaces has applications in the Finite Element Method of solid mechanics. The objective is to estimate the stress and strain on complex objects by partitioning them into small simple objects which are considered incompressible. It is convenient to approximate a plane surface with a simple polygon, i.e., a piecewise-linear, closed curve in the plane on m distinct vertices, which does not intersect itself. A chord is a line segment between two non-adjacent vertices of the polygon which lies entirely inside the polygon, so in particular, the endpoints of the chord are the only points of the chord that touch the boundary of the polygon. A triangulation of the polygon, is any choice of m - 3 chords, such that the polygon is divided into triangles. In a triangulation, no two of the chosen chords intersect each other, except at endpoints, and all of the remaining (unchosen) chords cross at least one of the chosen chords. Fortunately, finding an arbitrary triangulation is a fairly easy task, but what if you were asked to find the best triangulation according to some measure?
    avatar
    Figure 1: Five out of nine possible triangulations of the example polygon. The leftmost has the smallest largest triangle.

    Instructions

    Input

    On the first line of the input is a single positive integer n, telling the number of test scenarios to follow. Each scenario begins with a line containing one positive integer 2 < m < 50, being the number of vertices of the simple polygon. The following m lines contain the vertices of the polygon in the order they appear along the border, going either clockwise or counter clockwise, starting at an arbitrary vertex. Each vertex is described by a pair of integers x y obeying 0 <= x <= 10 000 and 0 <= y <= 10 000.

    Output

    For each scenario, output one line containing the area of the largest triangle in the triangulation of the polygon which has the smallest largest triangle. The area should be presented with one fractional decimal digit.

    Sample Input

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

    Sample Output

    9.0

    Analysis

    子结构是每次选取一个点,分成两块和一个三角形,然后找三者最大值,多次取点取最小值
    三者比较表达方式max(a,max(b,c))

    Code

    #include<bits/stdc++.h>
    using namespace std;
    struct Node{
        int x,y;
    }node[50];
    int dp[50][50];
    inline int S(Node& i,Node& k,Node& j){return abs(k.y*j.x-i.y*j.x-k.y*i.x-k.x*j.y+i.x*j.y+k.x*i.y);}
    bool check(int &i,int &k,int &j,int &m){
        for(int r=0;r<m;++r)if(r==i||r==k||r==j)continue;
        else if(S(node[i],node[k],node[r])+S(node[i],node[j],node[r])+S(node[k],node[j],node[r])
    ==S(node[i],node[j],node[k]))return 0;
        return 1;
    }
    int main(){
        int n,i,j,m,k;scanf("%d",&n);
        for(int sq=0;sq<n;++sq){
            scanf("%d",&m);
            for(i=0;i<m;++i)scanf("%d%d",&node[i].x,&node[i].y);
            for(int z=2;z<m;++z)for(i=0;(j=i+z)<m;++i){
            	dp[i][j]=70000000;
            	for(k=i+1;k<j;++k){
                    if(!check(i,j,k,m))continue;
    	            int t[3]={dp[i][k],dp[k][j],S(node[i],node[k],node[j])};
    	            dp[i][j]=min(dp[i][j],*max_element(t,t+3));
            	}
    		}
            printf("%.1f
    ",dp[0][m-1]/2.0);
        }
        return 0;
    }
    
  • 相关阅读:
    乐字节Java编程语言发展,面向对象和类
    乐字节Java编程之方法、调用、重载、递归
    乐字节Java循环:循环控制和嵌套循环
    乐字节Java反射之四:反射相关操作
    乐字节Java反射之三:方法、数组、类加载器和类的生命周期
    乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性
    乐字节Java反射之一:反射概念与获取反射源头class
    Java变量与数据类型之三:数据类型与转义字符
    数论 N是完全平方数 充分必要条件 N有奇数个约数
    动态规划专题 01背包问题详解 HDU 2546 饭卡
  • 原文地址:https://www.cnblogs.com/chanceYu/p/12150325.html
Copyright © 2011-2022 走看看