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]+ ...
随机推荐
- ModSecurity CRS笔记[转]
转自:http://danqingdani.blog.163.com/blog/static/186094195201472304841643/ ModSecurity的规则因为奇怪的正则(可读性差? ...
- cocos2d-x sprite触摸处理
转自:http://www.cnblogs.com/lancidie/archive/2013/04/01/2993890.html 我们常常需要判断用户的点击操作是否落于某个sprite之上,进而让 ...
- linux就是这个范儿之融于心而表于行(1)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明.否则将追究法律责 时间总是过得那么快,如流水一般哗啦啦的就淌走了一大堆!周遭事事沧桑变迁喧哗或耳语中流传的故事已渐模糊 ...
- node.js在windows下的学习笔记(9)---文件I/O模块
开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.将"hello world" ...
- POJ 3692 最大独立集
题意:有G个女生,B个男生,所有的女生都互相认识,所有的男生都互相认识,还有N对男女,他们互相认识. 问从中选出最多的人数,是的他们全部互相认识. 思路:这道题的构图很巧妙,对于他的补图构图,对于所有 ...
- 5分钟 搞定UIButton的文本与图片的布局
UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...
- 信号之kill和raise函数
kill函数将信号发送给进程或进程组.raise函数则允许进程向自身发送信号. #include <signal.h> int kill(pid_t pid, int signo); in ...
- sql server R2 下载地址收藏
SQL Server 2008 R2 下载地址 32位: http://care.dlservice.microsoft.com/dl/download/1/e/6/1e626796-588a-495 ...
- Android_menu_SubMenu
menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- ...
- Joseph cicyle's algorithm
约瑟夫环问题: 输入:1)总共人数:2)每次被杀的序号数: 输出:最后一个活着的序号 python代码如下: n=int (input('please input the number of peop ...