您的位置:首页 > 其它

【UVA1331】关于最优三角剖分

2015-10-23 20:18 323 查看
最近在练习DP专题,学会了很多表示方法和转换方法,今天做最优三角剖分的时候发现脑子卡了,不会表示状态,于是写个博客记录一下。

最优三角剖分的一类题目都是差不多的。给你一个多边形,让你把它分割成若干个三角形,求三角形某最优解,比如UVA1331要求面积最大的三角形的面积最小。如图是各种切割方法:

#include<cstdio>
#include<cstdlib>
#define INF 0xfffffff

const int Maxm=50+5;

int m;
int x[Maxm],y[Maxm];
double d[Maxm][Maxm];

double area(int a,int b,int c)
{
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]);
if(s<0) return -s;
return s;
}

double mymin(double a,double b) {return a<b?a:b;}

double mymax(double a,double b) {return a>b?a:b;}

bool check(int a,int b,int c)
{
int i;
for(i=1;i<=m;i++)
{
if(i==a||i==b||i==c) continue;
double d=area(a,b,i)+area(a,c,i)+area(b,c,i)-area(a,b,c);
if(d<0) d=-d;
if(d<=0.01) return 0;
}
return 1;
}

int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i,j,k;
scanf("%d",&m);
for(i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]);
for(i=m;i>=1;i--)
{
d[i][i+1]=0.0;
for(j=i+2;j<=m;j++)
{
d[i][j]=INF;
for(k=i+1;k<j;k++)
{
if(check(i,j,k))
d[i][j]=mymin(d[i][j],mymax(mymax(area(i,j,k),d[i][k]),d[k][j]));
}
}

}
printf("%.1lf\n",d[1][m]);
}
}


View Code

ps:给定三个点求面积最好用叉积,而如果知道三条边求面积用海伦公式。

20:19:34
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: