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数据库部分内容做一个对比,非 ...
随机推荐
- BellmanFord 最短路
时间复杂度:O(VE) 最多循环V次,每次循环对每一条边(共E条边)判断是否可以进行松弛操作 最多V次:一个点的最短路,最多包含V-1个点(不包含该点), 如d1->d2->d3-> ...
- Codeforce Div-2 985 C. Liebig's Barrels
http://codeforces.com/contest/985/problem/C C. Liebig's Barrels time limit per test 2 seconds memory ...
- 超详细从零记录Hadoop2.7.3完全分布式集群部署过程
超详细从零记录Ubuntu16.04.1 3台服务器上Hadoop2.7.3完全分布式集群部署过程.包含,Ubuntu服务器创建.远程工具连接配置.Ubuntu服务器配置.Hadoop文件配置.Had ...
- HTML的前世今生
HTML的基础知识扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 三年前,我就听周围的一些工程师说,python就是一个脚本语言,没啥好学的,学JAVA吧,python能干的J ...
- 基于windows server 2012 的微软桌面虚拟化实战教程
http://abool.blog.51cto.com/8355508/1587489/ Windows Server2012 中的“远程桌面服务”服务器角色中就提供了允许用户连接到虚拟机.Remot ...
- JS文本框获取焦点
所谓焦点,就是鼠标移上文本框的时候那个一闪一闪的光标.
- MySQL记录-Lost Connect MySQL Server during query解决方案
vim /etc/my.cnf ,在[mysqld]下面加上: skip-name-resolve max_allowed_packet = 800M default-character-set=ut ...
- MySQL邮件使用情况统计方法
邮件使用情况统计方法如下: ) AS domain, COUNT(DISTINCT [column_name]) AS mail_count, COUNT([column_name]) AS mail ...
- FZU - 1989 AntiAC
Problem 1989 AntiAC Accept: 93 Submit: 444Time Limit: 4000 mSec Memory Limit : 32768 KB Prob ...
- WorkerMan 入门学习之(三)基础教程-Timer类的使用
1.ServerTimer.php 代码: <?php /** * 定时器学习 */ require_once __DIR__ . '/Workerman/Autoloader.php'; us ...