首页 > 代码库 > UVa 1331 最大面积最小的三角剖分
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 }
UVa 1331 最大面积最小的三角剖分
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。