博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode_1039. Minimum Score Triangulation of Polygon_动态规划
阅读量:6265 次
发布时间:2019-06-22

本文共 848 字,大约阅读时间需要 2 分钟。

 

题意:给定一个凸的N边形(N<=50),每个顶点有一个权值A[i],把它分为N-2个三角形,每个三角形的val等于三个顶点的权值的乘积,问划分之后图形的val总和最小为多少。


 

一开始想到了,问题可以转换为求解子问题,由于没有想到如何进行状态转换,并且感觉贪心可行,

如下图1,将当前图形可以构成的三角形找出(红线为底边),从中找到val最小的三角形如图2,然后将其割除如图3,再将新的两个三角形找出。

   

然而这个思路并不可行,这个思路的局部最优并不能得到全局最优,按照上面的思路的策略如下图,得到结果40,而最优解是24。

贪心不可行,每次找到最优的三角形,最终全局未必最优。


然后,想到很可能是动态规划,但是想不出来,问题如何分解,状态如何表示。。。

参考别人的思路和代码(看了两个大佬的代码,思路几乎一样)

对于多边形上的任意一条边,它只能出现在一个三角形中,

dp[i][j]:从第i个点到第j个点的最小值。dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+A[i]*A[j]*A[k])。

如下图:此时求dp[0][5],以(0,5)为边,在(0,5)之间遍历三角形的顶点,构成的每个三角形将原图形分为三部分:三角形,子图形1,子图形2。

class Solution{public:    int minScoreTriangulation(vector
& A) { int dp[50][50]; memset(dp,0,sizeof(dp)); int numofnode = A.size(); for(int len=3; len<=numofnode; len++) for(int i=0; i+len-1

 

转载于:https://www.cnblogs.com/jasonlixuetao/p/10815277.html

你可能感兴趣的文章
max-width
查看>>
shell脚本操作mysql数据库
查看>>
NEC获得曼谷城市铁路新线路的通信及监控系统订单
查看>>
H3命令基础命令
查看>>
solr笔记
查看>>
hexdump常用参数
查看>>
Redis Lua scripts debugger
查看>>
Oracle手动删除归档日志厚,出现ORA-19571错误
查看>>
Linux(centos)新建,删除,移动文件夹和文件的命令
查看>>
Android开发之旅:应用程序基础及组件(续)
查看>>
Shell基础语法(中)
查看>>
怎么创建域控制器?
查看>>
网络层IP路由的负载均衡实现思路
查看>>
pfSense book之IPsec 站点到站点连接示例
查看>>
shell 使用字典
查看>>
LVS+Keepalived高可用群集
查看>>
使用篇-基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源
查看>>
一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作...
查看>>
Flex容器综合应用以及皮肤的添加效果
查看>>
JAVA常见算法题(三十五)
查看>>