博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)
阅读量:4544 次
发布时间:2019-06-08

本文共 812 字,大约阅读时间需要 2 分钟。

题目:

分析:

假设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

你可能感兴趣的文章
模拟3d
查看>>
【BZOJ】 1041: [HAOI2008]圆上的整点
查看>>
Oracle Data Guard 重要配置参数
查看>>
c3p0参数解释
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
查看>>
c++ 字符串转换
查看>>
Redis 补充
查看>>
iOS开发UI篇—UITableviewcell的性能优化和缓存机制
查看>>
第十五节:pandas之concat()级联
查看>>
.net中判断距离高考多长时间的js函数
查看>>
[HNOI2008]GT考试
查看>>
uva 437 The Tower of Babylon
查看>>
ubuntu 16.04 + python + matplotlib下画图显示中文设置
查看>>
SQL语句练习
查看>>
C#中不用安装Oracle客户端连接Oracle数据库(转)
查看>>
C++解析(24):抽象类和接口、多重继承
查看>>
【jdk源码3】HashMap源码学习
查看>>
[转载].NET IL 指令速查
查看>>
kafak manager + zookeeper + kafka 消费队列快速清除
查看>>
TFS工作区(Workspaces )命令
查看>>