uva 1331——Minimax Triangulation

题意:三角刨分,把一个m边形分解成m-2个三角形,求一个最大三角形最小的刨分,输出最小的那个三角形面积。


思路:递推。可能需要一点几何思维,d(i,j)为多边形的最优解,则d(i,j)=min(s(i,j,k),d(i,k),d(k,j));s(i,j,k)是三角形i-j-k的面积。然后枚举i,j,k求出最优即可。


code:

#include <bits/stdc++.h>
using namespace std;

#define ft(i,s,t) for (int i=s;i<=t;i++)
const int INF=0x3f3f3f3f;
const int N=55;
const double ep=1e-6;
struct node
{
	double x,y;
}v[N];
int n;
double dp[N][N];
double area (node A,node B,node C)
{
	return 0.5*fabs((B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y));
}

int ok(int a,int b,int c)
{
	double t=area(v[a],v[b],v[c]);
	ft(i,0,n-1)
	{
		if (i==a||i==b||i==c) continue;
		double sum=(area(v[a],v[b],v[i])+area(v[a],v[i],v[c])+area(v[i],v[b],v[c]));
		if (fabs(sum-t)<ep) return 0;
	}
	return 1;
}
double sol()
{
	double ans=INF;
	ft(i,2,n-1) ft(j,0,n-1)
	{
	    int r=(i+j)%n;
	    dp[j][r]=INF;
	    for(int k=(j+1)%n;k!=r;k=(k+1)%n){
            if (ok(j,k,r))
                dp[j][r]=min(dp[j][r],max(max(dp[j][k],dp[k][r]),area(v[j],v[k],v[r])));
	    }
	    if (i==n-1)
            ans=min(ans,dp[j][r]);
	}
	return ans;
}
int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d",&n);
		ft(i,0,n-1) scanf("%lf %lf",&v[i].x,&v[i].y);
		printf("%.1f\n",sol());
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值