bzoj 1096: [ZJOI2007]仓库建设
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]仓库建设的更多相关文章
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4201 Solved: 1851[Submit][Stat ...
- bzoj 1096: [ZJOI2007]仓库建设 斜率優化
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2242 Solved: 925[Submit][Statu ...
- bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3234 Solved: 1388[Submit][Stat ...
- 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——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法
[原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1998 Solved: 816 [id=10 ...
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...
- BZOJ 1096 ZJOI2007 仓库建设 边坡优化
标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...
- ●BZOJ 1096 [ZJOI2007]仓库建设
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题解: 斜率优化DP $(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c ...
- BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...
- bzoj 1096: [ZJOI2007]仓库建设【斜率优化】
好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...
随机推荐
- 基于EF创建数据库迁移
通过创建的实体类和DbContext类利用EF的Code First数据库迁移创建数据库. 下面看代码. 一.先创建实体类 我先添加一个BaseEntity,里面就一个属性 [Key] public ...
- HBase 和 MongoDB在设计上的区别
转载:http://leongfans.iteye.com/blog/1019383 昨天搜一下mongodb的资料,介绍应用的比较多,原理介绍的不多. 粗略得看了一下,总体来说两者的设计思路差不多, ...
- iis启动网站提示 文件正在使用
通常是端口被占用,使用netstat -ano,查看占用的进程pid,结束
- Select-Object用法
展开 modules 属性的详细信息 get-process |? {$_.processname -eq "cmd"}|select -ExpandProperty module ...
- nape.dynamics.InteractionGroup
(转载http://tomyail.com/blog/1123) 说明: Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionG ...
- ShowcaseView-master
ShowcaseView.rar
- 兼容:判断 iframe 是否加载完成
判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似 var iframe = document.createElement("iframe ...
- break和continue语句
跳转语句中断当前的执行过程,C++语言提供了4中跳转语句:break.continue.goto和return. break语句 break语句负责终止离他最近的while.do while.for或 ...
- php中body下出现莫名空白字符
php中body下出现莫名空白字符,出现原因 1. 模板前面有莫名格式空格,删不掉,必须把模板里面东西复制出来,新建一个文件弄进去,覆盖原有的 2.docutype前面出现代码,也会导致此问题(有可能 ...
- [转]oracle odp.net 32位/64位版本的问题
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...