[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……