假设顶点的总数为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 凸多边形的最优三角剖分..._第六次作业的更多相关文章

  1. Ex 6_20 最优二叉搜索树..._第六次作业

    假设关键字的总数为n,用c[i,j]表示第i个关键字到第j个关键字的最优二叉查找树的代价,我们的目标是求c[0,n-1].要求c[i,j],首先要从第i个关键字到第j个关键字中选一个出来作为根结点,选 ...

  2. Ex 6_9 某个字符串处理语言提供了一个将字符串一分为二的基本操作..._第六次作业

    设字符串的长度为n,整型数组arr[0. . .n-1]的第一个数和最后一个数为开始点与结束点的位置,中间的数为拆分点的位置,设cost[i,j]为第i个分割点到第j个分割点的最小代价,两个分割点之间 ...

  3. Ex 6_4 判断序列是否由合法单词组成..._第六次作业

    设字符串为s,字符串中字符的个数为n,vi[i]表示前i+1个字符是否能组成有效的单词vi[i]=true表示能组成有效的单词,vi[i]=false表示不能组成有效的单词,在每个字符串前加一个空格, ...

  4. 【UVA1331】关于最优三角剖分

    最近在练习DP专题,学会了很多表示方法和转换方法,今天做最优三角剖分的时候发现脑子卡了,不会表示状态,于是写个博客记录一下. 最优三角剖分的一类题目都是差不多的.给你一个多边形,让你把它分割成若干个三 ...

  5. (DP) 关于最优三角剖分

    https://www.cnblogs.com/Konjakmoyu/p/4905563.html 这个人写的好 最优三角剖分的核心思想: 确定决策顺序. 有时一个解可以用许多决策顺序得出, 这时候我 ...

  6. Hadoop作业性能指标及參数调优实例 (三)Hadoop作业性能參数调优方法

    作者: Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Had ...

  7. Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议

    作者:Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Hado ...

  8. ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...

  9. MySQL调优系列_日志分析

    前言 本篇主要总结一下MySQL数据库的几种日志,用于日常维护过程中问题解决和性能优化等,稍显基础,日常积累之用. 文章的部分内容会将MySQL数据库和SQL Server数据库部分内容做一个对比,非 ...

随机推荐

  1. SNP (Single Nucleotide Polymorphism), SNV ( single nucleotide variants ) , Indel (insertion-deletion) 的区别

    SNP (Single Nucleotide Polymorphism):强调在一个群体中具有一定频率的变异,一般为二态性.比如G→C SNV ( single nucleotide variants ...

  2. Eclipse导入模板格式Xml配置文件

    Eclipse一般常用的可以导入两处 *.xml 格式的模板,一个是常用的注释格式模板,另一个是代码格式化时用的模板,导入方法如下: 假设: 1.xml 是代码注释格式模板     2.xml 是代码 ...

  3. 2018.9青岛网络预选赛(B)

    传送门:Problem(B) https://www.cnblogs.com/violet-acmer/p/9664805.html 参考资料: https://blog.csdn.net/qq_40 ...

  4. P1282 多米诺骨牌

    P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S ...

  5. python自动化运维之路~DAY5

    python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...

  6. Jedis操作笔记 redis的五种存储类型

    常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 String是最简单的类型,一个key对应一个val ...

  7. python---网络之邮件发送

    在发送邮件之前需要先设置邮件开启了SMTP等功能,对于163还需要获取授权码 这里设置保存修改 这里获取授权码 完整封装发送邮件类 import smtplib from email.mime.tex ...

  8. js的模块化

    模块化的好处 以前我们平常写js,需要引用大量大js文件,还得注意先后顺序,因为是一层一层依赖的关系.很是麻烦,现在有了模块化,我们只需要知道,我们要实现这个功能需要哪一个js文件就ok,其他的不需要 ...

  9. Dapper总结(二)---事务和存储过程

    一  dapper使用事务 string sql1 = "insert into UserInfo values('user8',27,'s')"; string sql2 = & ...

  10. URLConnection 和 HttpClients 发送请求范例【原】

    笔记,未完全标准. java.net.URLConnection package test; import java.io.BufferedReader; import java.io.IOExcep ...