Ex 6_12 凸多边形的最优三角剖分..._第六次作业

假设顶点的总数为n,从0到n-1. 从序号为0的顶点开始以逆时针方向排序,对于

令子问题A[i,j]为包含顶点i,i+1, . . . j的凸多边形的最小三角剖分代价,dist(i,j)为顶点i到顶点j的距离。对于子问题A[i,j],考虑边e(i,j)最终会在某个三角形内,为了找出这个三角形,计算i到j之间的每个顶点k与i和j围成的三角形的对角线的和的最小值即为A[i,j],找出对角线和的最小值所对应的k,再继续查找A[i,k],A[k,j],直到多边形不能再划分为止,因此的到递推式

package org.xiu68.ch06.ex6;
public class Ex6_12 {
public static Point[] ps1,ps2;
//凸多边形的最优三角形剖分,求所有对角线之和的最小值
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
最小三角剖分代价为:8.47213595499958
三角形划分方式为:
Point:0,Point:4,Point:1
Point:1,Point:4,Point:2
*/
ps1=new Point[]{
new Point(2,0),
new Point(0,2),
new Point(0,4),
new Point(4,4),
new Point(4,2)
};
int[][] arr1=new int[ps1.length][ps1.length];
minTriangle(ps1,arr1); //8.47213595499958
System.out.println("三角形划分方式为:");
divide(arr1,0,ps1.length-1);
/*
最小三角剖分代价为:11.21110255092798
三角形划分方式为:
Point:0,Point:5,Point:1
Point:1,Point:5,Point:3
*/
System.out.println();
ps2=new Point[]{
new Point(0,2),
new Point(10,4),
new Point(12,4),
new Point(13,2),
new Point(12,0),
new Point(10,0)
};
int[][] arr2=new int[ps2.length][ps2.length];
minTriangle(ps2,arr2); //11.21110255092798
System.out.println("三角形划分方式为:");
divide(arr2,0,ps2.length-1);
}
//B中存放三角形的第三个顶点
public static void minTriangle(Point[] ps,int[][] B){
double[][] A=new double[ps.length][ps.length]; //子问题A[i][j]的最优三角剖分代价
for(int i=0;i<A.length;i++)
for(int j=0;j<A[i].length;j++){
A[i][j]=0;
B[i][j]=0;
}
for(int s=4;s<=ps.length;s++){ //包含s个顶点的多边形的最优剖分代价
for(int i=0;i<ps.length-s+1;i++){ //包含s个顶点的多边形的开始顶点,以逆时针方向前进
int j=i+s-1; //包含s个顶点的多边形的结束顶点
A[i][j]=Double.MAX_VALUE;
double temp=A[i][j];
//t为i和j的相对顶点,从i的后一个顶点开始,结束顶点为j的前一个顶点
for(int t=i+1;t<=j-1;t++){
if(t==i+1){ //t为i的后一个顶点
temp=dist(ps,t,j)+A[t][j];
}
else if(t==j-1){ //t为j的前一个顶点
temp=dist(ps,i,t)+A[i][t];
}else{ //t处于i的后一个顶点之后,j的前一个顶点之前
temp=dist(ps,i,t)+dist(ps,j,t)+A[i][t]+A[t][j];
}
if(A[i][j]>temp){
A[i][j]=temp;
B[i][j]=t;
}
}//
}//
}//
System.out.println("最小三角剖分代价为:"+A[0][ps.length-1]);
}
public static void divide(int[][] B,int i,int j){
if(B[i][j]!=0){
System.out.println("Point:"+i+",Point:"+j+",Point:"+B[i][j]);
divide(B,i,B[i][j]);
divide(B,B[i][j],j);
}
}
//顶点序号i和j之间的距离
public static double dist(Point[] ps, int i,int j){
double m1=Math.pow(ps[i].x-ps[j].x, 2);
double m2=Math.pow(ps[i].y-ps[j].y, 2);
return Math.sqrt(m1+m2);
}
}
class Point{
public double x;
public double y;
public Point(double x,double y){
this.x=x;
this.y=y;
}
}
Ex 6_12 凸多边形的最优三角剖分..._第六次作业的更多相关文章
- Ex 6_20 最优二叉搜索树..._第六次作业
假设关键字的总数为n,用c[i,j]表示第i个关键字到第j个关键字的最优二叉查找树的代价,我们的目标是求c[0,n-1].要求c[i,j],首先要从第i个关键字到第j个关键字中选一个出来作为根结点,选 ...
- Ex 6_9 某个字符串处理语言提供了一个将字符串一分为二的基本操作..._第六次作业
设字符串的长度为n,整型数组arr[0. . .n-1]的第一个数和最后一个数为开始点与结束点的位置,中间的数为拆分点的位置,设cost[i,j]为第i个分割点到第j个分割点的最小代价,两个分割点之间 ...
- Ex 6_4 判断序列是否由合法单词组成..._第六次作业
设字符串为s,字符串中字符的个数为n,vi[i]表示前i+1个字符是否能组成有效的单词vi[i]=true表示能组成有效的单词,vi[i]=false表示不能组成有效的单词,在每个字符串前加一个空格, ...
- 【UVA1331】关于最优三角剖分
最近在练习DP专题,学会了很多表示方法和转换方法,今天做最优三角剖分的时候发现脑子卡了,不会表示状态,于是写个博客记录一下. 最优三角剖分的一类题目都是差不多的.给你一个多边形,让你把它分割成若干个三 ...
- (DP) 关于最优三角剖分
https://www.cnblogs.com/Konjakmoyu/p/4905563.html 这个人写的好 最优三角剖分的核心思想: 确定决策顺序. 有时一个解可以用许多决策顺序得出, 这时候我 ...
- Hadoop作业性能指标及參数调优实例 (三)Hadoop作业性能參数调优方法
作者: Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Had ...
- Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议
作者:Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Hado ...
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- MySQL调优系列_日志分析
前言 本篇主要总结一下MySQL数据库的几种日志,用于日常维护过程中问题解决和性能优化等,稍显基础,日常积累之用. 文章的部分内容会将MySQL数据库和SQL Server数据库部分内容做一个对比,非 ...
随机推荐
- Solr7.1--- 生产环境搭建
准备三台虚拟机,把Solr-7.1.0.tgz上传到三个节点上.我上传到了自定义的目录/mysoft. 我的环境是CentOS7+Solr7.1.0 如果发现图文不符,因为我之前操作截图后,关闭出去吃 ...
- 洛谷 P3956 棋盘(BFS)
传送门:Problem P3956 https://www.cnblogs.com/violet-acmer/p/9827010.html 题解: BFS 相关变量解释: color[maxn][ma ...
- nginx 反向代理案例
server{ listen ssl; server_name a.xxxxx.com; root /home/wwwroot/default/asqumo; ssl_protocols TLSv1. ...
- Cookie浅谈
相信大家对Cookie多多少少都有点了解吧~~下面我来谈谈吧: 每个Cookie不超过4K数据,每个网站不超过20个Cookie,所有网站的Cookie总和不超过300个 虽然cookie已经是上世纪 ...
- python---ORM之SQLAlchemy(3)外键与relationship的关系
relationship是为了简化联合查询join等,创建的两个表之间的虚拟关系,这种关系与标的结构时无关的.他与外键十分相似,确实,他必须在外键的基础上才允许使用 不然会报错: sqlalchemy ...
- 循环内的switch中break和continue使用区别
首先看下break和continue的使用方法. break语句在循环和switch语句中使用,用于终止最近的封闭代码块,如果在嵌套循环中,则只终止最近的循环. continue语句在循环中使用,不能 ...
- json遍历 分别使用【原】
json遍历 一 使用org.json.JSONObject遍历 之后的所有遍历都参考了:http://blog.csdn.net/u010648555/article/details/4981538 ...
- js鼠标移入移出效果【原】
<HTML> <HEAD> <!-- meta 解释 : http://www.haorooms.com/post/html_meta_ds --> <met ...
- bootstrap3 input 验证样式【转】
feedback <form role="form"> <div class="form-group has-success has-feedback& ...
- BIO | NIO | AIO (Java版)
几篇解释的不错的文章: BIO NIO AIO NIO.2 入门,第 1 部分: 异步通道 API 使用异步 I/O 大大提高应用程序的性能