uva1331 Minimax Triangulation
题目大意:
按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值。
/*
dp[i][j]表示从第i个点到第j个点,划分成j-i-1个三角形的最优解,然后每次转移时,枚举长度和左边界始点,那么根据长度和左边界点就可以知道右边界点,然后枚举左边界和右边界中间的点k,dp[i][j] = min(dp[i][j], max(max(dp[i][k], dp[k][j]), Area(i, k, j)).但是有一个问题,即i,k,j三点围成的三角形是否符合要求,判断的条件即为是否存在除i,k,j三点外的一点位于三角形中,有面积法判断。
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std;
const int N = ;
const double INF = 0x3f3f3f3f3f3f;
const double eps = 1e-; struct point {
double x, y;
void get() {
scanf("%lf%lf", &x, &y);
}
}p[N]; int n;
double dp[N][N]; double area (point a, point b, point c) {
return fabs((b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y))/;
} bool judge(int a,int b,int c) {//是否存在除i,k,j三点外的一点位于三角形中
double cur=area(p[a],p[b],p[c]);
for(int i=;i<n;i++) {
if(i==a||i==b||i==c)
continue;
double tmp=area(p[a],p[b],p[i])+area(p[b],p[c],p[i])+area(p[c],p[a],p[i]);
if(fabs(tmp-cur)<eps)
return false;
}
return true;
} double solve () {
for (int i = ; i < ; i++) {
for (int j = ; j < n; j++)
dp[j][(j+i)%n] = ;
} for (int i = ; i < n; i++)
dp[i][(i+)%n] = area(p[i], p[(i+)%n], p[(i+)%n]);
for(int k=;k<n;k++){
for(int i=;i<n;i++){
int t=(i+k)%n;
dp[i][t]=INF;
for(int j=(i+)%n;j!=t;j=(j+)%n){
if(judge(i,t,j))dp[i][t]=min(dp[i][t],max(max(dp[i][j],dp[j][t]),area(p[i], p[j], p[t])));
}
}
} double ans = INF;
for (int i = ; i < n; i++)
ans = min (ans, dp[i][(i+n-)%n]);
return ans;
} int main () {
freopen("Cola.in","r",stdin);
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = ; i < n; i++)
p[i].get(); printf("%.1lf\n", solve());
}
return ;
}
100分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int t,n;
const double INF = 0x3f3f3f3f3f3f;
const double eps = 1e-;
double s[][][],dp[][];
struct node{
double x,y;
}pos[];
double count(int i,int j,int k){//计算面积
double x1=pos[i].x,x2=pos[j].x,x3=pos[k].x;
double y1=pos[i].y,y2=pos[j].y,y3=pos[k].y;
double xx1=x1-x3,xx2=x2-x3;
double yy1=y1-y3,yy2=y2-y3;
double res=fabs((xx1*yy2-xx2*yy1)/2.0);
return res;
}
bool judge(int a,int b,int c){
double cur=s[a][b][c];
for(int i=;i<=n;i++){
if(i==a||i==b||i==c)continue;
double tmp=s[a][b][i]+s[a][c][i]+s[b][c][i];
if(fabs(tmp-cur)<=eps)return ;
}
return ;
}
int main(){
freopen("Cola.in","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(s,,sizeof(s));
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)scanf("%lf%lf",&pos[i].x,&pos[i].y);
for(int i=;i<n;i++)
for(int j=;j<n;j++)
for(int k=;k<n;k++){
//s[i][j][k]=INF;
if(i!=j&&i!=k&&j!=k)
s[i][j][k]=count(i,j,k);
} for(int i=;i<n;i++)dp[i][(i+)%n]=s[i][(i+)%n][(i+)%n];
for(int k=;k<n;k++){
for(int i=;i<n;i++){
int t=(i+k)%n;
dp[i][t]=INF;
for(int j=(i+)%n;j!=t;j=(j+)%n){
if(judge(i,t,j))dp[i][t]=min(dp[i][t],max(max(dp[i][j],dp[j][t]),s[i][j][t]));
}
}
}
double ans=INF;
for(int i=;i<n;i++)
ans=min(ans,dp[i][(i+n-)%n]);
printf("%.1lf\n",ans);
}
}
wa 预处理了所有三角形的面积就迷之wa了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
int t,n;
int main(){
srand(time());
t=rand()%+;
printf("%d\n",t);
while(t--){
n=rand()%+;
printf("%d\n",n);
for(int i=;i<=n;i++){
int x=rand()%+,y=rand()%+;
printf("%d %d\n",x,y);
}
}
}
data 造小数据
#include<iostream>
#include<cstdio>
#include<cstring>
#include<windows.h>
using namespace std;
int main(){
int t=;
while(t--){
system("1331_data>Cola.in");
system("1331_thmyl<Cola.in>1.out");
system("1331_std<Cola.in>2.out");
if(system("fc 1.out 2.out"))break;
}
system("pause");
}
对拍
uva1331 Minimax Triangulation的更多相关文章
- UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化
题目链接:https://cn.vjudge.net/problem/UVA-1331 题意 给一个任意多边形,把它分为多个三角形. 求某方案中最大的三角形是各方案中最小的面积的三角形面积. 思路 学 ...
- uva 1331 - Minimax Triangulation(dp)
option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...
- Minimax Triangulation
题意: 按顺序给定一些点,把这些点分割为n - 2个三角形,花费为最大三角形面积,求最小花费 分析: 区间dp,dp[i][j]表示完成区间[i,j]最小花费,dp[i][j]=min(dp[i][j ...
- spoj Minimax Triangulation
题解: dp+计算几何 F[i][j]表示第i-j条边的答案 然后转移一下 代码: #include<bits/stdc++.h> using namespace std; ]; ][]; ...
- UVa 1331 - Minimax Triangulation(区间DP + 计算几何)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA - 1331 Minimax Triangulation (区间dp)(最优三角剖分)
题目链接 把一个多边形剖分成若干个三角形,使得其中最大的三角形面积最小. 比较经典的一道dp问题 设dp[l][r]为把多边形[l,r]剖分成三角形的最大三角形面积中的最小值,则$dp[l][r]=m ...
- Uva 1331 - Minimax Triangulation(最优三角剖分 区间DP)
题目大意:依照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. 思路:用区间DP能够非常方便解决,多边形可能是凹边形, ...
- [总结-动态规划]经典DP状态设定和转移方程
马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
随机推荐
- BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193 题意: 给定起点(px,py).终点(sx,sy).(x,y < 100000 ...
- POJ 3744 Scout YYF I:概率dp
题目链接:http://poj.org/problem?id=3744 题意: 有n个地雷,位置为pos[i]. 在每个位置,你向前走一步的概率为p,向前走两步的概率为1-p. 你的初始位置为1. 问 ...
- ES 相似度算法设置(续)
Tuning BM25 One of the nice features of BM25 is that, unlike TF/IDF, it has two parameters that allo ...
- listen 76
Flavors Fluctuate With Temperature Does an ice-cold drink actually taste better than the same bevera ...
- 2018.3.3 How too much fructose may cause liver damage
Fructose is the sweetest of the natural sugars. As its name suggests, it is found mainly in fruits. ...
- C/C++的四大内存分区和常量的存储位置
原文:https://blog.csdn.net/k346k346/article/details/45592329 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内 ...
- TCP协议与流通信
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP(Transportation Control Protocol)协议与IP ...
- ACM学习历程—POJ1151 Atlantis(扫描线 && 线段树)
Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...
- js 图片上传
可能很多不熟悉的图片上传的同学会觉得有点懵,其实做过一次你就会发现特别的简单. 只是一个formData格式的表单提交,把地址写到 action = "" 里面就可以了,当然你可以 ...
- 转 对APK进行重签名
1. 生成Android APK包签名证书1). 在doc中切换到jdk的bin目录cd C:\Program Files\Java\jdk1.6.0_18\bin2). 运 ...