题目大意:

按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成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. PAT 天梯赛 L3-008. 喊山 【BFS】

    题目链接 https://www.patest.cn/contests/gplt/L3-008 思路 因为 每个山头 最多有两个 能听到它的 临近山头 那么 我们就可以 给每个 山头 都 分配 最多两 ...

  2. shell的面试题

    在网上看到一道考shell的题--统计出一个文件夹下大小大于7MB的文件夹 好,我也来装一下深沉,个人觉得,这道题主要考的是对经常使用的linux的熟练程度(我不是很熟,哈哈),题目要统计,主要用到两 ...

  3. leetcode 859. Buddy Strings

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters i ...

  4. nodejs中的子进程,深入解析child_process模块和cluster模块

    Node.js的进程管理   node遵循的是单线程单进程的模式,node的单线程是指js的引擎只有一个实例,且在nodejs的主线程中执行,同时node以事件驱动的方式处理IO等异步操作.node的 ...

  5. Laravel的初始化安装

    Laravel的初始化安装 composer 安装 composer中国镜像laravel文档 curl -sS https://getcomposer.org/installer | php # 修 ...

  6. vue 动态传值笔记

    :prop="'answers.a' + item.split('.')[1]+'.total'" {{scope.row.answers['a'+item.split('.')[ ...

  7. 《CSS权威指南(第三版)》---第六章 文本属性

    本章主要的内容是: 1.文本缩进: text-indent.行内元素无法缩进,一般用左内边距或外边距来创造这种效果. 2.文本对齐:text-align .只应用于块状元素. 3.行高:一般line- ...

  8. BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1634 题意: 约翰留下他的N只奶牛上山采木.可是,当他回来的时候,他看到了一幕惨剧:牛们正 ...

  9. css(3)

    行内元素和块内元素可以通过定义display的属性值进行相互转换. 想要叫ul中的li实现横向显示可以在li中加入布局"float:left": 如: /*这个用于控制单个图片区域 ...

  10. laravel基础课程---14、表单验证(lavarel如何进行表单验证)

    laravel基础课程---14.表单验证(lavarel如何进行表单验证) 一.总结 一句话总结: lavarel的验证的功能比tp要[简单]且[强大]很多 直接控制器中:添加[规则数组]和[修改提 ...