目录
一.前言
DP一直是编程中的一个难题,解决它不仅需要大量刷题,还需要学会各种DP的方法。这里,我就主要讲一个DP的优化方法:平行四边形不等式优化DP动态规划。(好难呀)
二.平行四边形不等式是个啥?
1.题目引入:猴子派对
远离我们的世界,有一个香蕉森林。许多可爱的猴子住在那里。有一天,作为香蕉林之王的SDH(宋大侯)决定举办一个盛大的聚会庆祝疯狂香蕉日。但小猴子彼此不认识,所以作为国王,SDH必须做点什么。
现在有n只猴子坐成一圈,每只猴子都有交朋友的时间。而且,每只猴子都有两个邻居。SDH希望将它们介绍给对方,规则是:1。每次 ,他只能介绍一只猴子和一只猴子的邻居。
2.如果他介绍A和B,那么每只已经知道的每只猴子A都知道每只猴子B已经知道了,这次引入的总时间是所有猴子A和B已经知道的交友时间的总和;
3.每个小猴子都认识自己;
为了开始聚会并尽快吃香蕉,SDH想知道他需要的最短时间。
输入
有几个测试用例。在每种情况下,第一行是n(1≤n≤1000),这是猴子的数量。下一行包含n个正整数(小于1000),表示交朋友时间(按顺序,第一个和最后一个是邻居)。输入是文件结尾。
输出
对于每种情况,您应该打印一行,给出SDH引入时的最小时间。
样例输入
8
5 2 4 7 6 1 3 9
样例输出
105
2.找出状态转移方程式
大家先不管围成一个圈,先把它们看作一条直线。这道题的状态转移方程式很容易想到:就是在i~j号猴子的范围内,任取一个猴子k,当成是把这个猴子左边的那一堆猴子(i~k)介绍给它右边的那一堆猴子(k+1~j),先预处理计算出i~j号猴子交朋友的总时间w[i][j],于是,状态转移方程式就出来了:。
3.探索此状态转移方程式的性质
这可能有点难得想,大家一定要注意!
以现在的状态转移方程式来看是个三重循环,肯定要超时,不妨让我们来优化一下这个k。k的值肯定无法在每次直接确定,那么我们就缩小它的范围。
首先,我们来探索一下w[i][j]的性质:有,那么是毋庸置疑的。还有一个性质: