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 ...
随机推荐
- docker 网络模式研究了许久,其实我们需要的是docker run -p 80:80命令
我们只是希望能够从外部访问到docker而已,并不需要去折腾该死的网络模式,桥接,host等等. -p: 端口映射,格式为:主机(宿主)端口:容器端口 sudo docker run -t -i - ...
- POJ - 1321 棋盘问题 【DFS】
题目链接 http://poj.org/problem?id=1321 思路 和N皇后问题类似 但是有一点不同的是 这个是只需要摆放K个棋子就可以了 所以 我们要做好 两个出口 并且要持续往下一层找 ...
- ZOJ - 3861 Valid Pattern Lock 【全排列】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861 思路 先生成全排列,然后判断哪些情况不符合的,剔除就好了 ...
- Django的基础操作总结
1:准备开始 建立一个新的project: django-admin.py startproject XXXXXX(名称) 建立一个新的App:python manage.py startapp XX ...
- spring-boot5代码
App.java package com.kfit.spring_boot_mybatis; import org.mybatis.spring.annotation.MapperScan; impo ...
- leetcode 890. Possible Bipartition
Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of ...
- TensorFlow Action(开山使用篇)
1.TensorFlow安装: 使用pip install tensorflow安装CPU版: 或使用pip install tensorflow-gpu==1.2.1指定版本安装GPU版. 2.Te ...
- 畅游HttpCore
欢迎 非常欢迎阅读本文,本文主要介绍HttpCore是如何工作的. 你应该知道HTTP是一种用于在客户端与服务端进行消息交换的协议.它使用的特别广泛,它通常运行在TCP/IP或者安全的TLS/SSL之 ...
- Cocos2d-x中定时器的使用
CCTimer:轻量级的计时器 CCTimer (void) ccTime getInterval (void) void setInterval (ccTime fInterval) bool ...
- smack api 转载未测试
===============================================================主动发送信息给某个用户-------------------------- ...