题目大意:

按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成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的更多相关文章

  1. UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化

    题目链接:https://cn.vjudge.net/problem/UVA-1331 题意 给一个任意多边形,把它分为多个三角形. 求某方案中最大的三角形是各方案中最小的面积的三角形面积. 思路 学 ...

  2. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

  3. Minimax Triangulation

    题意: 按顺序给定一些点,把这些点分割为n - 2个三角形,花费为最大三角形面积,求最小花费 分析: 区间dp,dp[i][j]表示完成区间[i,j]最小花费,dp[i][j]=min(dp[i][j ...

  4. spoj Minimax Triangulation

    题解: dp+计算几何 F[i][j]表示第i-j条边的答案 然后转移一下 代码: #include<bits/stdc++.h> using namespace std; ]; ][]; ...

  5. UVa 1331 - Minimax Triangulation(区间DP + 计算几何)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. UVA - 1331 Minimax Triangulation (区间dp)(最优三角剖分)

    题目链接 把一个多边形剖分成若干个三角形,使得其中最大的三角形面积最小. 比较经典的一道dp问题 设dp[l][r]为把多边形[l,r]剖分成三角形的最大三角形面积中的最小值,则$dp[l][r]=m ...

  7. Uva 1331 - Minimax Triangulation(最优三角剖分 区间DP)

    题目大意:依照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. 思路:用区间DP能够非常方便解决,多边形可能是凹边形, ...

  8. [总结-动态规划]经典DP状态设定和转移方程

    马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...

  9. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

随机推荐

  1. Oracle伪列rownum

    Oracle基础知识:伪列rownum,伪列就像表中的列一样,但是在表中并不存储.伪列只能查询,不能进行增删改操作. 在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返 ...

  2. (转)CentOS 5.5 64bit 编译安装Adobe FlashMediaServer 3.5

    http://download.macromedia.com/pub/flashmediaserver/updates/4_0_2/Linux_32bit/FlashMediaServer4.tar. ...

  3. Java for LeetCode 091 Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  4. JavaScript预解释是一种毫无节操的机制

    前言 JavaScript是一门解释型的语言 , 想要运行JavaScript代码需要两个阶段 编译阶段: 编译阶段就是我们常说的JavaScript预解释(预处理)阶段,在这个阶段JavaScrip ...

  5. JS继承的实现方式

    JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 ...

  6. POJ 3071 Football:概率dp

    题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...

  7. Ajax处理后台返回的Json数据

    // 处理后台传来的Json字符串装换成Json对象 var dataJson = JSON.parse(data); // 此时可以从Json对象中取值 if(dataJson.result == ...

  8. L92

    The Difference between Honesty and Cheating We sign our names to various documents all the time. Som ...

  9. BZOJ_2957_楼房重建_线段树

    BZOJ_2957_楼房重建_线段树 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多 ...

  10. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...