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

题意:

  有n个工厂,从左往右排成一排,分别编号1到n。

  每个工厂里有p[i]件产品,到1号工厂的距离为x[i],在此处建一个仓库的花费为c[i]。

  现在你需要建造一些仓库,使得所有产品都被运送到仓库中来。

  产品只能从左往右运输。每一件产品运输一个单位距离的花费为1。

  问你最小总花费(运输费 + 建仓库花费)。

题解:

  表示状态:

    dp[i]表示在工厂i建了一个仓库,并且仓库1 to i中的产品都已经被运到仓库中了,此时的最小总花费。

  找出答案:

    ans = dp[n]

    因为无论如何都必须在工厂n处建一个仓库。

  如何转移:

    dp[i] = min dp[j] + ∑(p[k]*(x[i]-x[k])) + c[i]

    (j < i, k = j+1 to i)

    定义前缀和数组:sp[i] = ∑ p[j], s[i] = ∑(x[j]*p[j])

    (j = 1 to i)

    则原转移方程可化简为:

      dp[i] = min dp[j] + x[i]*(sp[i]-sp[j]) - s[i] + s[j] + c[i]

  边界条件:

    dp[0] = 0

  斜率优化:

    设j < k,且k的决策更优。

    则有:dp[j] + x[i]*(sp[i]-sp[j]) + s[j]> dp[k] + x[i]*(sp[i]-sp[k]) + s[k]

    整理得:(dp[j]+s[j]-dp[k]-s[k]) / (sp[j]-sp[k]) < x[i]

    (注意:因为sp[j]-sp[k]<0,所以除过来之后不等式要变号)

    所以slope(i,j) = (dp[i]+s[i]-dp[j]-s[j]) / (sp[i]-sp[j])

    由于x[i]递增,所以用单调队列维护下凸壳即可。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1000005
#define INF 1000000000 using namespace std; int n;
int q[MAX_N];
long long x[MAX_N];
long long p[MAX_N];
long long c[MAX_N];
long long s[MAX_N];
long long dp[MAX_N]; void read()
{
cin>>n;
memset(s,,sizeof(s));
memset(p,,sizeof(p));
for(int i=;i<=n;i++)
{
cin>>x[i]>>p[i]>>c[i];
s[i]=s[i-]+x[i]*p[i];
p[i]+=p[i-];
}
} inline double slope(int i,int j)
{
return (double)(dp[i]+s[i]-dp[j]-s[j])/(p[i]-p[j]);
} void work()
{
int l=,r=;
q[]=,dp[]=;
for(int i=;i<=n;i++)
{
while(l<r && slope(q[l],q[l+])<=x[i]) l++;
dp[i]=dp[q[l]]+x[i]*(p[i]-p[q[l]])-s[i]+s[q[l]]+c[i];
while(l<r && slope(q[r],i)<slope(q[r-],q[r])) r--;
q[++r]=i;
}
cout<<dp[n]<<endl;
} int main()
{
read();
work();
}

最新文章

  1. 49. 3种方法实现复杂链表的复制[clone of complex linked list]
  2. Oracle实战训练——ATM取款机业务
  3. 【转】wpa_supplicant与wpa_cli之间通信过程
  4. [ZT] 酒店大洗脑:最全各大国际酒店集团族谱图
  5. windows批处理中的%0 %1 %2 %3
  6. JavaScript练习题 全局变量 局部变量 作用域
  7. 如何使用phpstudy本地搭建多站点(每个站点对应不同的端口)
  8. overflow-x: scroll;横向滑动详细讲解
  9. [行业关键词] review code review
  10. Python3 tkinter基础 TK title 设置窗体的标题
  11. CentOS6.5 安装vncserver实现图形化访问
  12. lua中查询表元素规则(__index)解析
  13. [HDFS_4] HDFS 的 Java 应用开发
  14. Jquery相关插件
  15. java json注解
  16. Facebook工程师是如何改进他们Android客户端的
  17. Andoid自动判断输入是电话,网址或者Email的方法--Linkify
  18. UT源码+105032014070
  19. Fragment 底部菜单栏
  20. Eclipse FindBugs插件

热门文章

  1. vmstat 命令
  2. shiro设置session超时
  3. UML类图中的关系表示
  4. vue+mousemove实现拖动,鼠标移动过快拖动就失效
  5. thrift实例
  6. spring 事务传播行为类型
  7. SET IDENTITY_INSERT ON/OFF 权限
  8. Xshell调节字体大小和样式
  9. spring mvc注解和spring boot注解
  10. vue 指令系统的使用