https://leetcode.com/problems/minimum-score-triangulation-of-polygon/

题意:给定一个凸的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<int>& A)
{
int dp[][];
memset(dp,,sizeof(dp));
int numofnode = A.size();
for(int len=; len<=numofnode; len++)
for(int i=; i+len-<numofnode; i++)
{
int j=i+len-;
dp[i][j]=INT_MAX;
for(int k=i+; k<j; k++)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+A[i]*A[j]*A[k]);
}
return dp[][A.size()-];
}
};

最新文章

  1. Android动态加载学习笔记(一)
  2. linux 学习6 软件包安装
  3. iOS开发 swift3.0中文版
  4. 彻底搞懂Html5本地存储技术(一)
  5. js中Array自定义contains, indexOf, delete方法.
  6. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
  7. PHP class_exists 检查类是否已定义
  8. 关于tcc、tlink的编译链接机制的研究
  9. VBS操作JS网页元素实例
  10. WPF 杂谈——开篇简言。
  11. Swift实现JSON转Model - HandyJSON使用讲解
  12. Python之Threading模块
  13. Redis服务启动失败,提示:redis-server:command not found
  14. Moving Average
  15. Android 代码混淆配置总结
  16. redis日常使用汇总--持续更新
  17. python之tkinter使用-多选框实现开关操作
  18. poj1038 Bugs Integrated,Inc. (状压dp)
  19. mysql服务启动、停止、重启
  20. [No0000C2]WPF 数据绑定的调试

热门文章

  1. BZOJ_4276_[ONTAK2015]Bajtman i Okrągły Robin_线段树优化建图+最大费用最大流
  2. javascript之常遇到的浏览器兼容问题和解决方法
  3. H5页面解决左右滑动问题
  4. 【211】win10快捷键大全
  5. linux中用无名管道进行文件的读写
  6. RxJava入门之路(一)
  7. 洛谷 - P1434 - 滑雪 - 有向图最长链
  8. C++开发工程师面试题库 100~150道
  9. Codeforces510B【dfs】
  10. 鸟哥私房菜基础篇:vim 程序编辑器习题