单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569
题解:
F[i][j]表示前i天,目前手中有j股的最大收入
Case 1:第i天是第一次购买股票
F[i][j]=-j*AP[i]; (1<=j<=AS[i])
Case 2:第i天没有购买股票
F[i][j]=max(F[i][j],F[i-1][j])
Case 3:第i天买入j-k股
因为F[i][j]的最优情况是会顺承的,所以如果
第i天有交易的话,直接从第i-W-1天进行转移即可
F[i][j]=max(F[i][j],F[i-W-1][k]-AP[i]*(j-k))
(1<=j-k<=AS[i],i-W-1>=1)
Case 4:第i天卖出k-j股
F[i][j]=max(F[i][j],F[i-W-1][k]+BP[i]*(k-j))
(1<=k-j<=BS[i],i-W-1>=1)
再使用单调队列进行维护
所以对于Case 3:
找出max(F[i-W-1][k]+AP[i]*k)-AP[i]*j (1<=j-k<=AS[i],i-W-1>=1)
j-AS[i]<=k<=j-1,i-W-1>=1
对于Case 4:
找出max(F[i-W-1][k]+BP[i]*k)-BP[i]*j (1<=j-k<=BS[i],i-W-1>=1)
1+j<=k<=BS[i]+j,i-W-1>=1
额外:鸣谢@QZZ帮我解答了一个傻逼问题。
代码:
#include<cstdio>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn=,inf=<<;
int T,MaxP,W,F[maxn][maxn],AP[maxn],BP[maxn],AS[maxn],BS[maxn];
struct Node{ int k,data; }nd;
Node que[maxn];
int f1,f2,ans;
int main(){
scanf("%d%d%d",&T,&MaxP,&W);
for(int i=;i<=T;i++)
scanf("%d%d%d%d",&AP[i],&BP[i],&AS[i],&BS[i]);
for(int i=;i<=T;i++)
for(int j=;j<=MaxP;j++){
if(j<=AS[i]) F[i][j]=-j*AP[i];
else F[i][j]=-inf;
}
for(int i=;i<=T;i++){
for(int j=;j<=MaxP;j++) F[i][j]=max(F[i][j],F[i-][j]);
if(i-W->=){
int w=i-W-;
f1=;f2=;
for(int j=;j<=MaxP;j++){
while(f1<=f2 && que[f1].k<j-AS[i]) f1++;
if(f1<=f2) F[i][j]=max(F[i][j],que[f1].data-AP[i]*j);
while(f1<=f2 && F[w][j]+AP[i]*j>=que[f2].data) f2--;
que[++f2].k=j; que[f2].data=F[w][j]+AP[i]*j;
}
f1=;f2=;
for(int j=MaxP;j>=;j--){
while(f1<=f2 && que[f1].k>j+BS[i]) f1++;
if(f1<=f2) F[i][j]=max(F[i][j],que[f1].data-BP[i]*j);
while(f1<=f2 && F[w][j]+BP[i]*j>=que[f2].data) f2--;
que[++f2].k=j; que[f2].data=F[w][j]+BP[i]*j;
}
}
}
ans=-inf;
for(int i=;i<=MaxP;i++) ans=max(ans,F[T][i]);
printf("%d\n",ans);
return ;
}
By:AlenaNuna
单调队列优化DP || [SCOI2010]股票交易 || BZOJ 1855 || Luogu P2569的更多相关文章
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- 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 ...
- 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...
- 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP
上一篇blog已经讲了单调队列与单调栈的用法,本篇将讲述如何借助单调队列优化dp. 我先丢一道题:bzoj1855 此题不难想出O(n^4)做法,我们用f[i][j]表示第i天手中持有j只股票时,所赚 ...
- 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 ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...
- SCOI 股票交易 单调队列优化dp
这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...
- 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
随机推荐
- 字典的常见操作<二>
<1>len() 测量字典中,键值对的个数 <2>keys 返回一个包含字典所有KEY的列表 <3>values 返回一个包含字典所有value的列表 <4& ...
- Kettle使用教程之Job使用
1.Kettle的Job使用十分简单,这里也只是演示比较简单的操作,创建Job 2.点击转换,然后点击浏览,选择转换对象 3.执行按钮,运行该转换 4.如果需要长期的进行定时转换,可以在Job中的st ...
- maven将自己的springboot项目打包成jar包后,作为工具包引入其他项目,找不到jar中的类
将springboot项目打包成jar包,作为工具包导入项目后,找不到jar中的类. 原因是:springboot项目使用了自动的打包插件. 原先的插件配置: <build> <pl ...
- unity 角色换装
unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性: 更改mesh:mesh决定了部位的物体的外形,是主要的数据. 刷新骨骼:同一个部位下,不同的mesh ...
- LeetCode.970-强大的整数(Powerful Integers)
这是悦乐书的第367次更新,第395篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第229题(顺位题号是970).给定两个正整数x和y,如果对于某些整数i >= 0 ...
- 另一种分页器 不依赖Paginator模块的方法
""" 分页组件 """ class Pagination(object): def __init__(self, current_page ...
- ftp读取图片并转Base64
public String download(String ftpUrl,String sfzh){ FTPClient ftpClient = new FTPClient(); InputStrea ...
- 解决 Intellij IDEA Cannot Resolve Symbol ‘BASE Decoder’ 问题
最近接盘了用springboot框架搭建的后台,第一次接触java的我就遇上了bug: 因为jdk更新而导致Cannot Resolve Symbol ‘BASE Decoder’ 问题 看了很多网上 ...
- AppCan适配问题
使用AppCan调试中心时,屏幕适配是个问题,经过多次调试总结出如下经验: 1,使用HD+(1560 x 720):显示错乱 2,使用FHD+ (2340 x 1080):显示错乱 3,HD (128 ...
- Typora---markdown
一级标题 空格 编写内容 有序内容 +Tab 无序内容 -+Tab 代码块 print('hello world!') typora快捷键 标题1==ctrl +1 图片 表格 Ctrl + T 姓名 ...