[BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1096

分析:

假设1~10,如果在3 6 10建立仓库,那么当前建立仓库决策下的最优值肯定是1~2进3号仓库,4~5进6号仓库,7~9进10号仓库。也就是说仓库把1~n分成了若干段,每个段的所有点都去最近的下面那个仓库点。

于是可以写出朴素的方程:

f[i]=min{f[j]+w[j][i]}+c[i]

其中w[j][i]=(x[i]-x[j+1])*p[j+1]+(x[i]-x[j+2])*p[j+2]+(x[i]-x[j+3])*p[j+3]+……+(x[i]-x[i])*p[i]

这不论空间和时间都不可以的,不妨先把w[j][i]化简一下

w[j][i]=(p[j+1]+p[j+2]+……+p[i])*x[i]-(x[j+1]*p[j+1]+x[j+2]*p[j+2]+x[j+3]*p[j+3]+……x[i]*p[i]

     =(sump[i]-sump[j])*x[i]-(sum[i]-sum[j])

         =-x[i]*sump[j]+sum[j]+sump[i]*x[i]-sum[i]

所以

f[i]=min{f[j]-x[i]*sump[j]+sum[j]}+c[i]+sump[i]*x[i]-sum[i]

设f[i]=Z,-x[i]=k,sump[j]=x,sum[j]+f[j]=y

那么问题就变成了平面上有一些点(x,y),找一个点使得Z=kx+y最小

用线性规划的思路:y=-kx+Z

也就是一个斜率确定的直线从下面向上平移,第一次触及到的点就是所求点

首先容易想到使得Z最小的点一定在这些点的凸包上,所以每次新加入一个点就不断维护下凸的凸包。

其次,因为x[i]是单增的,所以-k越来越大,直线就越来越平缓,所以最优点在凸包上也不断的右移。说白了就是决策单调……

时间O(n),GG……

原文地址:https://www.cnblogs.com/wmrv587/p/3893538.html