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\n", d[1][n]);
61     }
62     return 0;
63 }

 

posted @ 2017-02-06 20:32  Kayden_Cheung  阅读(593)  评论(0编辑  收藏  举报
//目录