dp是很好想的了,关键是数据太大,普通dp肯定超时,所以一定有用某种优化,dp优化也就那么几种,这道题用的是斜率优化,先写出普通的状态转移方程: dp[i] = min{  dp[j] + Σ ( p[k] * (x[i] - x[k] ) ) ,  j+1 <=k <= i ,  0 <= j <= i-1}

这个式子应该是很好理解的。接下来,就要进行优化。dp[j] 无法改变, 所以只好放眼于第二项, 即sigma那一项

Σ ( p[k] * (x[i] - x[k] ) = Σ (p[k] * x[i] - p[k] * x[k]) = p[ j+1 ~ i] * x[i] - p[ j+1~i] * x[ j+1 ~i]

我们发现,这个式子中,x[i] 为当前点的量,而p[j+1 ~i] 和 p[j+1 ~i] * x[j+1 ~i] 很容易预处理得到。

于是,我们把 a[i] 定义为 到 i 为止所有货物的个数 即 sum( p[1~i] ) ; 把b[i] 定义为到 i 为止 所有 p[j] * x[j] 之和

即 sum( p[ j+1~i] * x[ j+1 ~i] ) ;

我们有了这两个预处理,就可以转化成斜率优化来做了,一开始的式子,我们转化为

dp[i] = min { dp[j] + x[i] * (a[i] - a[j]) - (b[i] - b[j]) }

剩下的就是斜率优化的内容了,这里不再赘述,注意一点,a[i] - a[j] 是负数 除过去要变号。

代码如下

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#define N 1000100
using namespace std; int n;
deque<int> q;
deque<int>::iterator x, y;
long long a[N]={}, b[N]={};
long long f[N], dis[N], c[N]; long long getup(int j, int k) { return f[j] - f[k] + b[j] - b[k]; }
long long getdown(int j, int k) { return a[j] - a[k]; }
long long getans(int j, int now) { return f[j] + (a[now] - a[j]) * dis[now] -b[now] + b[j] +c[now]; }
bool ketan(int j, int k, int now) { return getup(j, k) < dis[now] * getdown(j, k); }
bool keya(int i, int j, int k) { return getup(i, j) * getdown (j, k) > getup(j, k) * getdown(i, j); } int main()
{
scanf("%d",&n);
for (int i = ; i <= n; ++i)
{
long long z;
scanf("%lld%lld%lld", &dis[i], &z, &c[i]);
a[i] = a[i-] + z; b[i] = b[i-] + z*dis[i];
}
f[] = ; q.push_front();
for (int i = ; i <= n; ++i)
{
while (q.size() > )
{
x = q.begin(); y = x; y++;
if (!ketan(*y, *x, i)) break;
q.pop_front();
}
x = q.begin();
f[i] = getans(*x, i);
while (q.size() > )
{
x = q.end(); x--; y = x; y--;
if (!keya(*y, *x, i)) break;
q.pop_back();
}
q.push_back(i);
}
printf("%lld\n", f[n]);
}

bzoj 1096: [ZJOI2007]仓库建设的更多相关文章

  1. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  2. bzoj 1096: [ZJOI2007]仓库建设 斜率優化

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2242  Solved: 925[Submit][Statu ...

  3. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3234  Solved: 1388[Submit][Stat ...

  4. BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  5. 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法

    [原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1998  Solved: 816 [id=10 ...

  6. BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...

  7. BZOJ 1096 ZJOI2007 仓库建设 边坡优化

    标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...

  8. ●BZOJ 1096 [ZJOI2007]仓库建设

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题解: 斜率优化DP $(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c ...

  9. BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...

  10. bzoj 1096: [ZJOI2007]仓库建设【斜率优化】

    好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...

随机推荐

  1. java异步任务处理

    1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...

  2. iOS开发-表视图的使用

    // // ViewController.m // Simple Table // // Created by Jierism on 16/7/20. // Copyright © 2016年 Jie ...

  3. Android事件分发原理

    终于用上了word 2013来写博客,感觉真是老好了,以前在网页上写,老是要把网页拖上拖下的,每次都要吐一升老血啊,现在用上本地的word,瞬间感觉好多了.还有感谢为word写插件的这个大神,代码高亮 ...

  4. Custom Properties for Alert Description and Notification(PropertyBag)

    Alert Description Variables: For event Rules: EventDisplayNumber (Event ID):             $Data/Event ...

  5. [JavaScript]转--如何让JS代码高大上

    原文出处:http://www.cnblogs.com/wenber/p/3630373.html 1,创造简短的写法 你可以这么写: 1 var slice = Array.prototype.sl ...

  6. Socket之UDP发送文件

    内容导航 一. Socket之UDP异步传输文件    二.Socket之UDP异步传输文件 三.Socket之UDP异步传输文件-多文件传输和文件MD5校验 四.Socket之UDP异步传输文件-用 ...

  7. Apache的RewriteRule规则详细介绍

    R[=code](force redirect) 强制外部重定向 (rkyW z强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定, ...

  8. 如何取消tableView的footer的粘滞效果

    footer默认的是固定在底部的  但有时我们需要和view一起滚动 主要是在scrollViewDidScroll这个代理方法中监听滚动的状况 设置如下 - (void)scrollViewDidS ...

  9. angualrjs学习总结三(http、select、表格、指令以及事件)

    一:http XMLHttpRequest:$http是angularjs的一个核心服务,用于读取远程服务器的数据.$http.get(url) 是用于读取服务器数据的函数.举例:<div ng ...

  10. java基础学习总结五(递归算法、冒泡排序、查看生成API)

    一:递归算法 概念:自己调用自己的方法 示例代码如下: @Test /** * 递归求和 * 5+4+3+2+1=15 */ public void getSum() { long sum = sum ...