传送门

单调队列优化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. ADO 读写文本文件

    ' 创建配置文件            Open ThisWorkbook.Path & "\schema.ini" For Append As #1            ...

  2. Spring boot @PropertySource, @ImportResource, @Bean

    @PropertySource:加载指定的配置文件 /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类 ...

  3. as3 air 获取文件夹下的所有文件

    private function getFile(directory:File) { var files:Array = directory.getDirectoryListing(); for(va ...

  4. Kafka Manager 监控

    1.安装: 依赖java环境,须首先安装java运行环境,并正确设置路径. 确保kafka已经安装,且版本合适. 修改配置文件:   kafka-manager.zkhosts="你的zoo ...

  5. spring cloud: eureka搭建

    1. 添加pom 依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  6. unity 设置屏幕旋转

    只允许竖屏: Portrait                    √ Portrait Upside Down √ Landscape Right        × Landscape Left ...

  7. cprogram作业

    刘金福 SA17225205 第三次作业 url:http://blog.csdn.net/liu896749150/article/details/78176433 学号:SA17225404 姓名 ...

  8. Python 列表表达式 ,迭代器(1)

    python 环境 3.5 1.列表: s = []; for i in s: i = handleFunction(i); s.append(i) .列表 s=[handleFunction(i) ...

  9. Swagger+ springfox +Spring mvc

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...

  10. appcan更新

    升级用到了config.xml文件中配置的‘更新地址‘所填写的url,此url开发者可任意配置自己的服务器地址* 当app执行uexWidget.checkUpdate()时,AppCan会请求上述u ...