算法设计与实现  王晓东

题目描述:

用多边形顶点的逆时针序列表示凸多边形,即P={v0,v1,…,vn-1}表示具有n条边的凸多边形。
给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得即该三角剖分中诸三角形上权之和为最小。
解题思路:
若凸(n+1)边形P={v0,v1,…,vn-1}的最优三角剖分T包含三角形v0vkvn,1≤k≤n-1,则T的权为3个部分权的和:三角形v0vkvn的权,子多边形{v0,v1,…,vk}和{vk,vk+1,…,vn}的权之和。可以断言,由T所确定的这2个子多边形的三角剖分也是最优的。因为若有{v0,v1,…,vk}或{vk,vk+1,…,vn}的更小权的三角剖分将导致T不是最优三角剖分的矛盾。

  
那么我们定义一个t[i][j],1<=i<=j<=N,为凸子多边形{vi-1,vi,…,vj}的最优三角剖分所对应的权函数值,即其最优值。据此定义,要计算的凸(n+1)边形P的最优权值为t[1][n]。
t[i][j]的值可以利用最优子结构性质递归地计算。当j-i≥1时,凸子多边形至少有3个顶点。由最优子结构性质,t[i][j]的值应为t[i][k]的值加上t[k+1][j]的值,再加上三角形vi-1vkvj的权值,其中i≤k≤j-1。由于在计算时还不知道k的确切位置,而k的所有可能位置只有j-i个,因此可以在这j-i个位置中选出使t[i][j]值达到最小的位置。由此,t[i][j]可递归地定义为:
对于要求的t[1][n],可以用通过由下至上的,从链长(多边形的边)为2开始计算,每次求t[i][j]的最小值,并且记录最小值所对应的K值,根据最优子结构的性质,逐步向上就可以求出t[1][n]的最小值。
类似的,求三角划分顶点的乘积的最小值问题,也是一样的。
代码实现:
#include <stdio.h>#define N 6        //顶点数/边数int weight[][N] = {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},
{1,2,1,6,0,1},{4,3,4,2,1,0}};int t[N][N];    //t[i][j]表示多边形{Vi-1VkVj}的最优权值
int s[N][N];    //s[i][j]记录Vi-1到Vj最优三角剖分的中间点Kint get_weight(const int a, const int b, const int c)
{return weight[a][b] + weight[b][c] + weight[c][a];
}void minest_weight_val()
{int i,r,k,j;int min;for (i = 1; i < N; i++){t[i][i] = 0;}for (r = 2; r < N; r++){for (i = 1; i < N-r+1; i++){j = i + r -1;min = 9999;        //假设最小值for (k = i; k < j; k++){t[i][j] = t[i][k] + t[k+1][j] + get_weight(i-1,k,j);if (t[i][j] < min)        //判断是否是最小值
                {min = t[i][j];s[i][j] = k;    }}t[i][j] = min;        //取得多边形{Vi-1,Vj}的划分三角最小权值
        }}
}void back_track(int a, int b)
{if (a == b) return;back_track(a,s[a][b]);back_track(s[a][b]+1,b);    //记得这是要加一printf("最优三角: V%d V%d V%d.\n",a-1,s[a][b],b);
}int main()
{minest_weight_val();printf("result:%d\n",t[1][N-1]);back_track(1,5);return 0;
}

2013/9/3 10:06

转载于:https://www.cnblogs.com/Jason-Damon/p/3298172.html

动态规划--凸多边形最优三角剖分相关推荐

  1. 动态规划---例题5.凸多边形最优三角剖分问题

    一.题目描述 通常,用多边形顶点的序列来表示一个凸多边形,即P=<v0 ,v1 ,- ,vn-1>表示具有n条边v0v1,v1v2,- ,vn-1vn的一个凸多边形,其中,约定v0 = v ...

  2. —【动态规划】凸多边形最优三角剖分

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 0014 ...

  3. 7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!

    一:题目: 给定n边凸多边形P,要求确定该凸多边形的三角剖分(将多边形分割成n-2个三角形),使得该三角剖分中诸三角形上权之和为最小.各边弦的权值以由输入数据给出,以无向图的形式表示.三角形的权值等于 ...

  4. 凸多边形最优三角剖分

    凸多边形最优三角剖分 问题描述 (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T. (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w.要求确定该 ...

  5. 最优java三角剖分算法代码,动态规划之凸多边形的最优三角剖分

    该题的题意大致为:一个n个角的凸多边形,,用互不相交的弦将其分为一个个的三角形,每个三角形的权值都是由三角形的边和弦组成权值函数w,求解如何划分才能使所有的角上的权值和达到最小. 根据动态规划算法的主 ...

  6. 凸多边形最优三角形剖分

    问题描述 当一个简单的多边形及其内部构成一个闭凸集时,则称该简单多边形为一个凸多边形.即凸多边形边界上或内部任意两点所连成的直线上所有的点都在多边形内部或边界上.通常用顶点的逆时针序列来表示凸多边形, ...

  7. 【动态规划、计算几何】最优三角剖分

    整理的算法模板合集: ACM模板 目录 最优三角剖分 UVA1331 最大面积最小的三角剖分 Minimax Triangulation 最优三角剖分 问题描述: 给一个有n个顶点的凸多边形,有很多方 ...

  8. DP——最优矩阵链乘最优三角剖分

    最优矩阵链乘: 一个n*m的矩阵乘一个m*p的矩阵等于一个n*p的矩阵,运算量为mnp,现在有一组n个矩阵组成的序列,求运算量的最小值. 这是DP中的最优矩阵链乘问题,我们可以这么理解:用一个d[i] ...

  9. 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...

    详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...

最新文章

  1. 使用Python,OpenCV生成Aruco标记
  2. 删除git commit 的 UserInterfaceState.xcuserstate 文件
  3. 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
  4. CouchDB与Couchbase:区别何在,Membase又将如何?
  5. 基于《河北省重大技术需求征集系统》的可用性和可修改性战术分析
  6. codevs 4927 线段树练习5 线段树基本操作模板
  7. CSS3j背景渐变,字体颜色渐变,以及兼容IE写法
  8. 转 黑客帝国解读 Matrix的世界
  9. 选项不属于HTML语言特点,Web前端开发初级模拟测试卷一(2)
  10. 在Windows8系统下exe格式会计课件下载播放帮助图解
  11. 模块一 day03 Python基础
  12. 同行评审就是个笑话!Nature爆料:计算机生成的垃圾文章竟还能被接受,64%来自中国...
  13. 重力传感器、加速度传感器以及陀螺仪的区别
  14. 2013年新会计准则常用会计科目表经典注释整理【最全】
  15. Golang seelog 使用入门简介
  16. 计算机网络应用押韵句,沙雕押韵很可爱的rap的句子 笑掉大牙的押韵句子
  17. 海思Hi3559AV100移植Qt5.9.1
  18. Linux驱动笔记-TNYCL
  19. Android(Kotlin)图片按钮,单选框,复选框(实验课)
  20. 2015年西南交通大学首次招收大数据研究生

热门文章

  1. [latex]图片动态缩放的PDF动画示例
  2. 谷歌也被逼出局域网了 baidu从此天下无敌
  3. 记一次程序员在办公室里的“撕逼”经历
  4. 安装mariadb以及允许远程访问
  5. SVNserver搭建和使用(二)
  6. EditText 被遮挡和显示不全问题
  7. Oracle SQL性能优化技巧大总结
  8. Linux系统平台上安装和配置Ruby on Rails
  9. 'SVN更新' has encountered a problem :An internal error occurred during: svn错误
  10. android 判断手机为小米