题目大意很简单,和普通的石子合并过程没有区别,只是花费变成了一个多项式,若连续的任意个石子权值和为x,那么代价变为F(x) = sigma(a[i] * x^i),求将n堆石子合并为一队的最小花费。
对于暴力的做法,复杂度是O(n^3)的,所以要优化
我们知道当a, b, c, d(a <= b < c <= d)当有cost[a][c] + cost[b][d] <= cost[a][d] + cost[b][c] 时,我们称其满足四边形不等式,设p[i][j]表示当区间[i, j]取最优决策时所选择的下标,这时可以证明有p[i][j - 1] <= p[i][j] <= p[i + 1][j](花了我好长时间终于证明了),没事了可以证明下看看,也可以记住这个结论。
这时当按区间dp时,计算区间[i, j]的最优解,只要枚举[p[i][j - 1], p[i + 1][j]]即可,由于数组p取值为[1, n]且是单调的,所以枚举的总复杂度为O(n),最后加上区间枚举的复杂度,总复杂度为O(n^2)
所以对于一般性的题目,需要证明的只有dp量是不是满足四边形不等式的,对于这道题就是要证明:
设sum(a, b) = x, sum(b, c) = z, sum(c, d) = y;
有 F(x + z) + F(y + z) <= F(z) + F(x + y + z),即证明:
sigma(a[i] * ( (x + z)^i + (y + z)^i - z^i - (x+y+z)^i )) <= 0,转化为证明:
(x + z) ^ n + (y + z) ^ n - z ^ n - (x + y + z) ^ n <= 0恒成立。
很明显这个不等式可以利用数学归纳法加以简单的证明。
1 #include