zoukankan      html  css  js  c++  java
  • [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……

  • 相关阅读:
    NYOJ题目22 素数求和
    最大连续子序列&&MAX SUM
    Computer Transformation
    #转 二分查找
    吃巧克力
    公司年会
    亲和串
    开门人和关门人
    找新朋友
    big number
  • 原文地址:https://www.cnblogs.com/wmrv587/p/3893538.html
Copyright © 2011-2022 走看看