传送门

单调队列优化dp好题。

有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值。

显然f[i][j]可以从f[i-w-1][k]转移过来。

方程很好推啊。

对于j&lt;kj&lt;kj<k和j&gt;kj&gt;kj>k的情况我们分别对第二维建立单调队列转移。

代码:

#include<bits/stdc++.h>
#define N 2005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int f[N][N],n,w,P,ap[N],bp[N],as[N],bs[N],q[N],hd,tl,ans=0;
inline int max(int a,int b){return a>b?a:b;}
int main(){
	n=read(),P=read(),w=read();
	for(int i=1;i<=n;++i)ap[i]=read(),bp[i]=read(),as[i]=read(),bs[i]=read();
	memset(f,-0x3f,sizeof(f));
	for(int i=1;i<=n;++i){
		for(int j=0;j<=as[i];++j)f[i][j]=-ap[i]*j;
		for(int j=0;j<=P;++j)f[i][j]=max(f[i][j],f[i-1][j]);
		if(i>w+1){
			hd=1,tl=0;
			for(int j=0;j<=P;++j){
				while(hd<=tl&&q[hd]+as[i]<j)++hd;
				while(hd<=tl&&f[i-w-1][j]+ap[i]*j>=f[i-w-1][q[tl]]+ap[i]*q[tl])--tl;
				q[++tl]=j,f[i][j]=max(f[i][j],f[i-w-1][q[hd]]-ap[i]*(j-q[hd]));
			}
			hd=1,tl=0;
			for(int j=P;~j;--j){
				while(hd<=tl&&q[hd]-bs[i]>j)++hd;
				while(hd<=tl&&f[i-w-1][j]+bp[i]*j>=f[i-w-1][q[tl]]+bp[i]*q[tl])--tl;
				q[++tl]=j,f[i][j]=max(f[i][j],f[i-w-1][q[hd]]+bp[i]*(q[hd]-j));
			}
		}
	}
	for(int i=0;i<=P;++i)ans=max(ans,f[n][i]);
	cout<<ans;
	return 0;
}

2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)的更多相关文章

  1. 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 ...

  2. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...

  3. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

    上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...

  4. 1855: [Scoi2010]股票交易[单调队列优化DP]

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  5. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  6. LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

    传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...

  7. SCOI 股票交易 单调队列优化dp

    这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...

  8. BZOJ 1855 股票交易 - 单调队列优化dp

    传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...

  9. BZOJ1855 [Scoi2010]股票交易[单调队列dp]

    题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...

随机推荐

  1. tomcat 服务器发布网站

    第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: D:\Program Files\Apache Software Foundation ...

  2. mysql case, if

    if语句: 用法和excel的if函数很像 if(expr1, value_if_expr1_is_true, value_if_expr1_is_false) select if(tag = 3, ...

  3. scala-学习 2

    列表操作 List() 或者是 Nil 空list scala> val a = List() a:List[Nothing] = List() print(a.length) a.length ...

  4. python格式化输出(转)

    在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...

  5. electron 大体结构

    1.Electron支持的平台: OS XWindowsLinux 2.一个标准的electron app包含的结构: Windows 或是 Linux中:electron/resources/app ...

  6. Hbase—学习笔记(一)

    此文的目的: 1.重点理解Hbase的整体工作机制 2.熟悉编程api,能够用来写程序 1.  什么是HBASE 1.1.   概念特性 HBASE是一个数据库----可以提供数据的实时随机读写 HB ...

  7. tomcat 管理端 安全措施

    由于公司的项目并未启用nginx负载均衡,所以自然也没用到tomcat与web应用一对一的安全操作,经常会遇到 重启单个应用又不想重启tomcat的情况.同时,又出于安全考虑,将tomcat的默认管理 ...

  8. centos 网卡聚合及Cisco交换机链路聚合

    一.配置环境 centos 系统.网卡1口和2口做链路聚合.    交换机网口 6口和7口. 二.服务器操作步骤 centos 6 1.创建一个channel bonding interface #v ...

  9. 使用一般处理程序(IHttpHandler)制作图片水印

    做网站的时候经常需要将图片加上网站名称的水印.这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传.但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原.这 篇教程教大家利用 ...

  10. jquery 处理重新绑定插件的方法

    比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert- ...