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数据库部分内容做一个对比,非 ...
随机推荐
- windows下用bat启动jar包,修改cmd标题(title)
新建start.bat,输入以下内容即可. @echo off title myprogress-%date%-%time%-%cd% java -jar myprogress.jar
- [luogu2657][windy数]
luogu2657 思路 数位dp,记录下上个位置的数,如果当前的数字与上个数字的差值小于2,就不再转移.还是要注意排除前导0.在记忆化的时候,全都是前导0的情况不能记忆化. 代码 #include& ...
- (转)JVM——自定义类加载器
背景:为什么要自定义,如何自定义,实现过程 转载:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 为什么需要自定义类加载器 网上 ...
- 有趣的async
在项目的开发过程中,同步异步是一个很重要的概念.但是在js中,又会有稍微的不同. 依据微软的MSDN上的解说: (1) 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所 ...
- redis访问安全加固
目录 redis漏洞 入侵特征 安全隐患 redis安全规范 禁止root用户启动 限制redis文件目录访问权限 开启密码认证,设置复杂密码 禁用或重命名危险命令 设置允许监听地址,不要使用0.0. ...
- 代替C++的getchar()
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in =n ...
- 黑客专用操作系统——Kali Linux简介
1如果您之前使用过或者了解BackTrack系列Linux的话,那么我只需要简单的说,Kali是BackTrack的升级换代产品,从Kali开始,BackTrack将成为历史. 如果您没接触过Back ...
- MyBatis中resultType和resultMap的区别
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义.因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名 ...
- Telnet Protocol Specification
Network Working Group J. Postel Request for Comments: 854 J. Reynolds ISI Obsoletes: NIC 18639 May 1 ...
- CSS —— 选择器
选择器种类 标签选择器 id选择器 类选择器 通配符 交集选择器 并集选择器 后代选择器 子代选择器 选择器设置样式优先级 默认样式 < 继承样式 < 通配符设置样式 < 标签选择器 ...