Vijos 1243 生产产品 (单调队列优化的动态规划)
题意:中文题。不说了。
注意一些地方,机器的执行过程是没有顺序的,而且每个机器可以用多次。第一次执行的机器不消耗转移时间K。
用dp[i][j]表示第i个机器完成第j个步骤的最短时间,sum[j][i]表示第i个机器完成前j个步骤的时间。
比较容易想到一个朴素的状态转移方程:
dp[i][j]=min{dp[k][j']+sum[j][i]-sum[j'][i]}+K (j-j'<l),(i!=k)
这里状态是O(n*m),转移是O(n*l),一定会超时,需要优化。
方程变形得dp[i][j]=min{dp[k][j']-sum[j'][i]}+sum[j][i]+K
在这里如果把k和i看作常数,那么dp[k][j']-sum[j'][i]是一个只和j'量。由于k和i比较小,我们完全可以枚举k和i的所有情况,我们定义该量为opt[i][k],我们只需要维护j-l到j这段范围内这个量的最小值即可。这里使用二维的优先队列来解决。转移部分优化成O(n)。总时间可以接受。
笔者曾经一度被初始化部分卡住,所以这里着重解释一下初始化部分的写法。
当j=1时,j唯一可能转移而来的状态就是j=0,所以首先我们要在队列里存入所有队列里存入j=0的下标,但这样还不够,还要更新j=0的状态,j=0时opt[i][k]这个变量是等于0,所以对应opt[i][k]=dp[k][0]+sum[0][i],需要把dp[k][0]和sum[0][i]都初始化为0。其他情况下,dp[i][j]都初始化为INF。
可以这么写:
memset(dp,0x7f,sizeof(dp));
; i<=n; ++i)
dp[i][]=;
; i<=n; ++i)
; j<=n; ++j)
dq[i][j].push_back();
或者是下标j从0开始枚举,这样就包含了将j=0存入队列的部分,而初始化j=0的状态还是要自己来写。
维护队首和队尾的部分,要一次性全部完成,不能一次维护一个。
最后要注意的一个地方就是第一个机器是不花费转移机器的时间的,所以时间里要减去一个K。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<string>
#include<vector>
#include<deque>
using namespace std;
][];
][];
deque<][];
int calc(int i,int j,int k)
{
return dp[k][j]-time[j][i];
}
int main()
{
int m,n,K,l;
scanf("%d%d%d%d",&m,&n,&K,&l);
; i<=n; ++i)
{
; j<=m; ++j)
{
int t;
scanf("%d",&t);
time[j][i]=time[j-][i]+t;
}
}
int ans=0x7fffffff;
memset(dp,0x7f,sizeof(dp));
; i<=n; ++i)
dp[i][]=;
; j<=m; ++j)
{
; i<=n; ++i)
; k<=n; ++k)
if(i!=k) while(!dq[i][k].empty()&&(j-dq[i][k].front())>l) dq[i][k].pop_front();
; i<=n; ++i)
; k<=n; ++k)
if(i!=k)
{
,b=;
if(!dq[i][k].empty()) a=calc(i,dq[i][k].front(),k);
b=time[j][i]+K;
dp[i][j]=min(dp[i][j],a+b);
}
; i<=n; ++i)
; k<=n; ++k)
if(i!=k)
{
while(!dq[i][k].empty()&&(calc(i,dq[i][k].back(),k)>=calc(i,j,k))) dq[i][k].pop_back();
dq[i][k].push_back(j);
}
}
; i<=n; ++i)
ans=min(ans,dp[i][m]);
printf("%d\n",ans-K);
;
}
Vijos 1243 生产产品 (单调队列优化的动态规划)的更多相关文章
- vijos 1243 生产产品 DP + 单调队列优化
LINK 题意:有1个产品,m个步骤编号为1~m.步骤要在n个机器人的手中生产完成.其中,第i个步骤在第j个机器人手中的生产时间给定为$T[i][j]$,切换机器人消耗cost.步骤必须按顺序,同一个 ...
- vijos 1243 生产产品
貌似两年前联赛复习的时候就看过这题 然而当时大概看看了 感觉太难 便没有去做 如今再去做的时候 发现其实也并不容易 ------------------------------------------ ...
- vijos P1243 生产产品(单调队列+DP)
P1243生产产品 描述 在经过一段时间的经营后,dd_engi的OI商店不满足于从别的供货商那里购买产 品放上货架,而要开始自己生产产品了!产品的生产需要M个步骤,每一个步骤都可以在N台机器 ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- UESTC 880 生日礼物 --单调队列优化DP
定义dp[i][j]表示第i天手中有j股股票时,获得的最多钱数. 转移方程有: 1.当天不买也不卖: dp[i][j]=dp[i-1][j]; 2.当天买了j-k股: dp[i][j]=max(dp[ ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
随机推荐
- c++ string 与 char 互转 以及base64
c++ string 与 char 互转 很简单如下 ] = {'A','B','C','D','E'}; printf("%s\n",bts); //char to string ...
- ios 开发 收起键盘的小技巧
在UIViewController中收起键盘,除了调用相应控件的resignFirstResponder方法外,还有另外三种方法: 1.重载UIViewController中的touchesBegin ...
- css选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先
通配选择符* { sRules } 类型选择符E { sRules } td { font-size:14px; width:120px; } 属性选择符 E [ attr ] { sRule ...
- (21)odoo中的QWeb模板引擎
-----------------更新时间18:13 2016-04-05 星期二-----------------* 概述 QWeb是odoo主要模板引擎,采用xml表述,最后生成HTML文件 ...
- jsp基础知识(基本的语法及原理)
jsp 语法分为三种不同的类型: (1) 编译器指令: 类如: <%@ page import="java.io.*"%> (2) 脚本语法: 指定的是java代码: ...
- 手动实现KVO
前言 KVO(Key-Value Observing, 键值观察), KVO的实现也依赖于runtime. 当你对一个对象进行观察时, 系统会动态创建一个类继承自原类, 然后重写被观察属性的sette ...
- wait(), notify(),sleep详解
在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的 ...
- 20145236 冯佳 《Java程序设计》第3周学习总结
20145236 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 一.面向对象和面向过程 •面向对象是相对面向过程而言 •面向对象和面向过程都是一种思想 •面向过程 ...
- easyui numberbox不可编辑
今天又遇到了给easyui中numberbox设置不可编辑的功能,在(http://www.jeasyuicn.com/api/docTtml/index.htm)API中找到了一个方法:
- [转]JDE910--jas.ini参数说明
配置 jas.ini 文件 jas.ini 文件可以使用 Java™ Application Server (JAS) 来提供 JDE 安装的配置.您必须针对特定于每个环境的 JDE 实例来配置 ja ...