【UVA1331】关于最优三角剖分
2015-10-23 20:18
323 查看
最近在练习DP专题,学会了很多表示方法和转换方法,今天做最优三角剖分的时候发现脑子卡了,不会表示状态,于是写个博客记录一下。
最优三角剖分的一类题目都是差不多的。给你一个多边形,让你把它分割成若干个三角形,求三角形某最优解,比如UVA1331要求面积最大的三角形的面积最小。如图是各种切割方法:
View Code
ps:给定三个点求面积最好用叉积,而如果知道三条边求面积用海伦公式。
20:19:34
最优三角剖分的一类题目都是差不多的。给你一个多边形,让你把它分割成若干个三角形,求三角形某最优解,比如UVA1331要求面积最大的三角形的面积最小。如图是各种切割方法:
#include<cstdio> #include<cstdlib> #define INF 0xfffffff const int Maxm=50+5; int m; int x[Maxm],y[Maxm]; double d[Maxm][Maxm]; double area(int a,int b,int c) { double s=(double)(1.0/2)*(x[a]*y[b]+x[b]*y[c]+x[c]*y[a]-x[a]*y[c]-x[b]*y[a]-x[c]*y[b]); if(s<0) return -s; return s; } double mymin(double a,double b) {return a<b?a:b;} double mymax(double a,double b) {return a>b?a:b;} bool check(int a,int b,int c) { int i; for(i=1;i<=m;i++) { if(i==a||i==b||i==c) continue; double d=area(a,b,i)+area(a,c,i)+area(b,c,i)-area(a,b,c); if(d<0) d=-d; if(d<=0.01) return 0; } return 1; } int main() { int n; scanf("%d",&n); while(n--) { int i,j,k; scanf("%d",&m); for(i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]); for(i=m;i>=1;i--) { d[i][i+1]=0.0; for(j=i+2;j<=m;j++) { d[i][j]=INF; for(k=i+1;k<j;k++) { if(check(i,j,k)) d[i][j]=mymin(d[i][j],mymax(mymax(area(i,j,k),d[i][k]),d[k][j])); } } } printf("%.1lf\n",d[1][m]); } }
View Code
ps:给定三个点求面积最好用叉积,而如果知道三条边求面积用海伦公式。
20:19:34
相关文章推荐
- 你得首先理解领域需求
- 概念完整性
- jsp文件开头<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 > 有什么用
- 图像处理中的数学原理详解(Part4) ——傅立叶级数的概念1
- ws2_32.lib 网络编程
- Linux下Firefox打开文件jnlp文件
- PCA主成分分析的原理解析
- javascript基础之二(变量作用域的各种啃)
- 马哥linux学习笔记 重定向
- Linux下的Socet网络编程
- 服务器架构
- iOS宏定义的使用与规范
- 多少人如此相似地重复
- Light OJ 1021 - Painful Bases(状态压缩DP)
- 鲍鹏山:我们培养了很多高学历的野蛮人
- YTU2507——李白打酒(蓝桥杯赛题)
- [sicily]1232. Electrical Outlets
- win7系统中安装SQL2005出现29506错误码的解决方案
- Cpp--C++中函数模板的用法详细解析
- 分布式服务器