题目大意:

按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成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. python多进程编程常用到的方法

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程.python提供了非常好用的多进程包Multiprocessing,只需要定义 ...

  2. PAT 甲级 1005. Spell It Right (20) 【字符串】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1005 思路 因为 n <= 10^100 所以 要用字符串读入 但是 100 * 100 ...

  3. HAOI 2017 游记

    省选 2017年4月23日 流水账式游记,不喜勿喷. Day0: 准备出发,上午敲了一顿板子,板子敲完了就打小游戏,老师也不管了. 过程中各种奶,说什么今年一定考仙人掌啦,今年一定考字符串啦,今年一定 ...

  4. ubuntu14开发环境配置

    1 配置JDK1.8 jdk工具从官网下载,我下载到了~/tool目录下,首先进入用户的bash配置目录,打开配置文件: cd ~ vi .bashrc 编辑.bashrc文件,在适当位置或者文件最后 ...

  5. Android Studio 主题、字体大小的设置

    1. Android Studio 主题的设置: 设置Android Studio 自带的主题 设置第三方主题 2. Android Studio 字体的设置 设置左面包名的字体大小 设置右面代码编辑 ...

  6. [原创]Java给word中的table赋值

    一.准备工作: 下载PageOffice for  Java:http://www.zhuozhengsoft.com/dowm/ 二. 实现方法: 要调用PageOffice操作Word中的tabl ...

  7. logistic function 和 sigmoid function

     简单说, 只要曲线是 “S”形的函数都是sigmoid function: 满足公式<1>的形式的函数都是logistic function. 两者的相同点是: 函数曲线都是“S”形. ...

  8. animation-delay负值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Gym:101630J - Journey from Petersburg to Moscow(最短路)

    题意:求1到N的最短路,最短路的定义为路径上最大的K条边. 思路:对于每种边权,假设为X,它是第K大,那么小于X的变为0,大于K的,边权-X.然后求最短路,用dis[N]+K*X更新答案. 而小于K的 ...

  10. 【算法模板】Binary Search 二分查找

    模板:(通用模板,推荐) 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...