2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门
单调队列优化dp好题。
有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值。
显然f[i][j]可以从f[i-w-1][k]转移过来。
方程很好推啊。
对于j<kj<kj<k和j>kj>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)的更多相关文章
- 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 ...
- 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 ...
- 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- 2018.09.06 烽火传递(单调队列优化dp)
描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...
- LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)
传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...
- SCOI 股票交易 单调队列优化dp
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...
- BZOJ 1855 股票交易 - 单调队列优化dp
传送门 题目分析: \(f[i][j]\)表示第i天,手中拥有j份股票的最优利润. 如果不买也不卖,那么\[f[i][j] = f[i-1][j]\] 如果买入,那么\[f[i][j] = max\{ ...
- BZOJ1855 [Scoi2010]股票交易[单调队列dp]
题 题面有点复杂,不概括了. 后面的状态有前面的最优解获得大致方向是dp.先是瞎想了个$f[i][j]$表示第$i$天手里有$j$张股票时最大收入(当天无所谓买不买). 然后写了一个$O(n^4)$状 ...
随机推荐
- JSON解析工具比较,主要GSON和FastJSON
JSON解析工具比较,主要GSON和FastJSON 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确 ...
- MDAC 重新安装
MDAC 重新安装 c:\windows\inf 下找出mdac.inf 然后点右键->安装
- DrawDib 使用例子<转>
#include<vfw.h>#pragma comment(lib,"Vfw32.lib") BITMAPINFOHEADER biHeader; memset(&a ...
- C++实现ping功能<转>
今天接到需求要实现ping的功能,然后网上查了一些资料,对网络编程的一些函数熟悉了一下,虽然还有一些细节不清楚,但是慢慢积累. 要实现这样的功能: 基础知识 ping的过程是向目的IP发送一个type ...
- Centos 安装golang beego
刚开始用go和beego,真的还好多不懂~希望对看到的朋友有帮助~ 本人环境:centos 6.3x86_64 1.我在机器上创建了一个用户zww(useradd zww),登录zww(su zww) ...
- textbox显示定位到最后一行(最新一行)
this.textBox1.Select(this.txtMsgInfo.TextLength, 0); this.textBox1.ScrollToCaret();
- edgeR
1)简介 edgeR作用对象是count文件,rows 代表基因,行代表文库,count代表的是比对到每个基因的reads数目.它主要关注的是差异表达分析,而不是定量基因表达水平. edgeR wor ...
- 表单跳转到Struts2
在使用表单跳转到Struts2时,路径一直不正确. login.html如下: <form action="login.do" method=post> 账号:< ...
- chrome input去除黄色背景色
input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset; border: 1px solid #CCC!impo ...
- 1.Two Sum (Array; HashTable)
Given an array of integers, find two numbers such that they add up to a specific target number. The ...