太感人了!
hdu 3516,你终于给我过了……
四边形不等式……看了许久,总算用上了一回,这道题和石子合并http://blog.csdn.net/abcjennifer/archive/2010/08/11/5805330.aspx的思路是一模一样的,详解见我上一篇《动态规划经典——石子归并》。
由于点都是从左上往右下来的(Consider a two-dimensional space with a set of points (xi, yi) that satisfy xi < xj and yi > yj for all i < j. )且要求最后合并成一堆,所以和石子合并一样,每次相邻的两个才合并。
首先最基本的思路是DP,状态转移方程
其中f[i,j]是从i到j合并连续点的最优解,sum[i,j]是合并者相邻两堆需要加上的代价。
现在的复杂度是O(n3),详细代码见上一篇
[算法优化]:
怎么把复杂度降为O(n2)呢?
优化k!(k是i..j的分割点)
原来我是从i...j-1枚举k, 取f(i,j)=min{f[i,k]+f[k+1,j]}+sum(i,j);
而实际上我只需要从s[i,j-1]到s[i+1,j]枚举k就可以了。其中s[i,j]指f[i...j]取最优解的分割点,这样复杂度就变成O(n2)啦!
Tree Construction
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 273 Accepted Submission(s): 125
![](https://i-blog.csdnimg.cn/blog_migrate/250971ecb3527f9d8319f947184c7f1f.jpeg)
Write a program that finds a tree connecting all given points with the shortest total length of edges.
5 1 5 2 4 3 3 4 2 5 1 1 10000 0
12 0