文章目录

  • 一、题目描述
  • 二、解题思路
    • 1. 定义状态
    • 2. 定义状态转移方程
    • 3. 初始化
    • 4. 计算方式
  • 三、代码实现
  • 四、执行结果
  • 五、思考

一、题目描述

设A是顶点为0,1,…,n-1的n凸多边形,可以用不在内部相交的n-3条对角线将A划分成三角形,如下图就是5边形的所有的划分方案.假设凸n边形的边及对角线的长度dij,都是给定的正整数,0≤i<j≤n-1.划分后三角形ijk的权值等于其周长,求具有最小权值的划分方案.设计一个动态规划算法求解这个问题,说明算法的时间复杂度.

示例1:

输入:d = [  [0,2,3,1,5,6],[2,0,3,4,8,6],[3,3,0,10,13,7],[1,4,10,0,12,5],[5,8,13,12,0,3],[6,6,7,5,3,0]]
输出:54

二、解题思路

1. 定义状态

​ 为了应用动态规划,我们需要将多边形切成小块.可以观察到,所输入的多边形每条边都肯定只能归属于一个三角形.将这条边要变为一个三角形意味着得确定第三个顶点,如上图所示.一旦我们找到正确的连接顶点,多边形的剩余部分就会被划分为两个小块,而这两块都需要进行最优的三角剖分.令dp[i][j]为从顶点vi到顶点vj进行三角剖分所需的费用,计入从vi到vj的弦长.递推式如下:

dp[i][j]=min(dp[i][k]+dp[k][j]+dik+dkj+dij)dp[i][j] = min(dp[i][k] + dp[k][j] + d_{ik} + d_{kj} + d_{ij})dp[i][j]=min(dp[i][k]+dp[k][j]+dik​+dkj​+dij​)

2. 定义状态转移方程

  • 当j - i = 1时,有

​ dp[i][j]=0dp[i][j] = 0 dp[i][j]=0

  • 当j - i > 1时,有

    dp[i][j]=min(dp[i][k]+dp[k][j]+dik+dkj+dij),i<k<jdp[i][j] = min(dp[i][k] + dp[k][j] + d_{ik} + d_{kj} + d_{ij}),i < k < jdp[i][j]=min(dp[i][k]+dp[k][j]+dik​+dkj​+dij​),i<k<j

3. 初始化

​ 当j - i = 1时,有dp[i][j]=0dp[i][j] = 0dp[i][j]=0

4. 计算方式

​ 自底向上,自左向右计算dp数组

三、代码实现

/*** 最小三角权剖分**  @author hh*  @date 2021-5-24 23:35*/
public class MinWeightTriangulation {public int minWeight(int[][] d){int[][] dp = new int[d.length][d[0].length];for(int i = d.length - 1; i >= 0; i--){for(int j = 0; j < d[0].length; j++){if(j - i == 1){dp[i][j] = 0;continue;}dp[i][j] = Integer.MAX_VALUE;for(int k = i + 1; k < j; k++){dp[i][j] = Math.min(dp[i][j],dp[i][k] + dp[k][j] + d[i][k] + d[k][j] + d[i][j]);}}}return dp[0][d[0].length -1];}public static void main(String[] args){int[][] d = new int[][]{{0,2,3,1,5,6},{2,0,3,4,8,6},{3,3,0,10,13,7},{1,4,10,0,12,5},{5,8,13,12,0,3},{6,6,7,5,3,0}};MinWeightTriangulation minWeightTriangulation = new MinWeightTriangulation();System.out.println(minWeightTriangulation.minWeight(d));}
}

四、执行结果

五、思考

​ 本题和字符串切分、矩阵链乘法的做法非常相似,也是非常经典的,都是对dp数组进行线性划分,读者有时间可以看我的另一篇文章动态规划经典题目-字符串切分、动态规划经典题目-矩阵链乘法,进行举一反三。

动态规划经典题目-最小权三角剖分相关推荐

  1. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  2. 动态规划经典题目-数据压缩之图像压缩

    文章目录 一.题目描述 二.解题思路 1. 定义状态 2. 定义状态转移方程 3. 初始化 4. 计算方式 三.代码实现 四.执行结果 五.思考 一.题目描述 ​ 计算机中的图像由一系列像点构成,每个 ...

  3. 动态规划经典题目——最大子矩阵和

    一.题目 题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和.例子如下图所示: 它的最大子矩阵的和为15: 二.解题思路 此题的解法与动态规划经典题目--最大连续子序列之和题目思想一样,只 ...

  4. 动态规划经典题目整理

    动态规划经典题目整理 背包问题 最长公共子串问题 连续数组最大和问题 持续增加中.... 背包问题 复杂度 O(nW)O(nW)O(nW) nnn为物品种类,WWW是背包的重量 目的:使得背包中的物品 ...

  5. poj动态规划经典题目

    列表一:经典题目题号: 容易: 1018, 1050, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1 ...

  6. 动态规划经典题目汇总

    http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html 转载之前先Orz一下: [s:19] Robberies http://a ...

  7. 动态规划经典题目总结

    微信公众号 在算法中,动态规划题目算是比较经典的一类题目.在找工作中,不管是笔试,还是面试,我们经常会遇到用动态规划来解决问题的情况,有时候面试官还需要我们现场手写出动态规划解法的代码.因此,在求职中 ...

  8. 动态规划经典题目——数塔问题

    一.题目 数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 二.解题思路 动态规划解题思路可详见另一篇文章.数塔中元素用二维数组a[][]表示 ①定义状态 ...

  9. 动态规划经典题目-找零钱的最少硬币数

    文章目录 一.题目描述 二.解题思路(朴素版本) 1. 定义状态 2. 定义状态转移方程 3. 初始化 三.代码实现 四.优化 五.执行结果 一.题目描述 ​ 美国的硬币按照面值1, 5, 10, 2 ...

最新文章

  1. 如何利用图像预处理提高OCR的准确性?
  2. 数论基础--洛谷P1072 Hankson 的趣味题
  3. 第三讲,我们来谈谈:“二进制的负数”
  4. 增长黑盒:零代码基础做智能电商网站,不要重复发明轮子
  5. [计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程
  6. UA OPTI501 电磁波3 SI单位制与电磁学常用单位
  7. 数据中心的运维管理原则(二)
  8. 思想解读:optee中的多线程处理
  9. c语言省2全民,C语言省试题(2-数据类型)101016.ppt
  10. python to sql_python的to_sql那点儿事
  11. 张俊红22岁年度总结
  12. 福师计算机辅助设计1 ps 在线作业二,福师《计算机辅助设计1(PS)》在线作业一100分答案...
  13. 【XSY2720】区间第k小 整体二分 可持久化线段树
  14. 一次ORACLE启动报错修复的记录
  15. 工信部召开地方信息安全工作会议
  16. Xilisoft DVD to iPhone Converter使用教程
  17. 服务器启动首选项不是虚拟盘,没法开启CPU虚拟化,BIOS没有开启的选项
  18. Python每日一练-----三点共线问题
  19. 【报告分享】 2020年中国汽车用户消费洞察白皮-懂车帝巨量算数(附下载)
  20. 计算机网络教程 第6版

热门文章

  1. 网页php如何判断登录手机串号_php如何判断客户端是pc还是手机?
  2. BAPI:创建退货订单-BAPI_CUSTOMERRETURN_CREATE
  3. Oracle拉里:云计算贱卖了啊【软件网每日新闻播报│第9-21期】
  4. 2023 女神猛将传3D卡通竖版三国卡牌回合类手游Win服务端源码
  5. ESP32驱动WS2812
  6. coolpad(酷派)真机测试logcat打印日志输出level级别设置
  7. FLP、CAP和BASE
  8. PHP和HTML混合编写
  9. 你真的会用iPad吗,如何使iPad秒变生产力工具?在iPad上用vscode写代码搞开发
  10. android4.3 电话簿6,通讯录联系人恢复