题面:P2569 [SCOI2010]股票交易

题解:

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的更多相关文章

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

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

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

  3. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

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

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

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

  6. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  7. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

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

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

  9. 单调队列优化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. linux添加新用户

    使用root用户adduser yj 后面操作有提示 用这种方法新建的用户会在home下生成用户文件夹

  2. Win10 安装LoadRunner11遇到的问题及解决方案

    由于以用户或者管理员身份执行setup.exe都不能正常安装,如下截图是异常信息.尝试了网上很多修改本地组策略的方法,还是不行,最后只能通过DOS命令来执行setup.exe.

  3. ASP.NET MVC 发布WIN SERVER2012

    首先在打开服务器管理,点添加角色和功能 这个名字自己设置不打紧 勾选web服务器,之后点下一步 在功能选择中勾选下面部分 之后点击工具选择服务,确保web服务正在运行 此时服务端告一段落,返回主机打开 ...

  4. harbor无法上传镜像解决

    报错:[root@bogon harbor]# docker login 192.168.43.65:5000Username (admin): Password: Login Succeeded [ ...

  5. java:LeakFilling(JSP,servlet,Ajax,Json,Path)

    1. request.setAttribute("test", "测试");       request.getRequestDispatcher(" ...

  6. video标签在移动端的一些属性值设置

    <video x5-video-orientation="portraint" src="" loop x-webkit-airplay="al ...

  7. lua基础学习(四)

    一,lua字符串   单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符.   1.几个常用的转义字符 \b 退格 \f 换页 \n 换行 \r 回车 \t 跳到下一个tab位置 \0 ...

  8. IDEA 对spring boot Maven 项目打 Jar 包

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...

  9. 第七周作业&实验报告5

     实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结 ...

  10. 小记------mongodb数据库如何进行模糊查询

    // 模糊匹配createTime   是以 2019-07-23 开头 db.getCollection('driver_online_record').find({"createTime ...