这道题 我很蒙.....
首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化

这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天
不允许有操作!就是与这些天的状态无关!
那么每一天更新那一天已经定了那么他对后面要转移的地方的影响就是手里的票了
既然这样就加一维表示
f[i][j]表示到第i天手里有j个票的最大收益这样就无后效性了
f[i][j]=Max(f[i][j],f[last][x]-(j-x)*in[i]);
f[i][j]=Max(f[i][j],f[last][x]+(x-j)*out[i]);
f[i][j]=Max(f[i][j],f[i-1][j]);
三种最大即为所求(第三种是不进行任何操作根据状态数组的增性就用前一个状态来修改就行了)
我很蒙......

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int f[][],in[],out[],inm[],outm[];
int t,mp,w;
deque<int>q;
inline int Max(int x,int y)
{
return x>y?x:y;
}
inline void push(int i,int j,int x)
{
while(!q.empty())
{
int y=q.back();
if(f[i][j]>=f[i][y]-in[x]*(j-y))q.pop_back();
else{ q.push_back(j);break;}
}
if(q.empty())q.push_back(j);
}
inline void pop1(int j)
{
while(q.front()>j&&!q.empty())q.pop_front();
}
inline void push1(int i,int j,int x)
{
while(!q.empty())
{
int y=q.back();
if(f[i][j]>=f[i][y]+out[x]*(y-j))q.pop_back();
else{ q.push_back(j);break;}
}
if(q.empty())q.push_back(j);
}
inline void pop(int j)
{
while(q.front()<j&&!q.empty())q.pop_front();
}
int main()
{ scanf("%d%d%d",&t,&mp,&w);
memset(f,0xaf,sizeof(f));
for(int i=;i<=t;i++)scanf("%d%d%d%d",&in[i],&out[i],&inm[i],&outm[i]);
for(int i=;i<=w+&&i<=t;i++)
{
f[i][]=;
for(int j=;j<=inm[i];j++)
f[i][j]=f[i][j-]-in[i];
for(int j=;j<=mp;j++)
f[i][j]=Max(f[i][j],f[i-][j]);
}
for(int i=w+,last=;i<=t;i++,last++)
{
q.clear();
for(int j=;j<=mp;j++)
{
pop(j-inm[i]);
push(last,j,i);
int x=q.front();
f[i][j]=Max(f[i][j],f[last][x]-(j-x)*in[i]);
}
q.clear();
for(int j=mp;j>=;j--)
{
pop1(j+outm[i]);
push1(last,j,i);
int x=q.front();
f[i][j]=Max(f[i][j],f[last][x]+(x-j)*out[i]);
}
for(int j=;j<=mp;j++)
f[i][j]=Max(f[i][j],f[i-][j]);
}
int ans=;
for(int i=;i<=mp;i++)ans=Max(ans,f[t][i]);
printf("%d",ans);
return ;
}

SCOI 股票交易 单调队列优化dp的更多相关文章

  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. 【bzoj1855】 [Scoi2010]股票交易 单调队列优化DP

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

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

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

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

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

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

  7. BZOJ1855 股票交易 单调队列优化 DP

    描述 某位蒟佬要买股票, 他神奇地能够预测接下来 T 天的 每天的股票购买价格 ap, 股票出售价格 bp, 以及某日购买股票的上限 as,  某日出售股票上限 bs, 并且每次股票交 ♂ 易 ( 购 ...

  8. 股票交易——单调队列优化DP

    题目描述 思路 蒟蒻还是太弱了,,就想到半个方程就GG了,至于什么单调队列就更想不到了. $f[i][j]$表示第$i天有j$张股票的最大收益. 那么有四种选择: 不买股票:$f[i][j]=max( ...

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

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

随机推荐

  1. Hadoop(21)-数据清洗(ELT)简单版

    有一个诸如这样的log日志 去除长度不合法,并且状态码不正确的记录 LogBean package com.nty.elt; /** * author nty * date time 2018-12- ...

  2. python3 练习题100例 (二十九)猴子吃桃问题

    题目内容: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第n天(<1<n< ...

  3. Leecode刷题之旅-C语言/python-83删除排序链表中的重复元素

    /* * @lc app=leetcode.cn id=83 lang=c * * [83] 删除排序链表中的重复元素 * * https://leetcode-cn.com/problems/rem ...

  4. C语言程序设计·谭浩强(第四版)第二章课后习题的答案,算法——程序的灵魂

    C语言程序小练习 1.用C语言设计程序算出1-1/2+1/3-14+1/5...+1/99-1/100的值 #include<stdio.h> int main() { ; double ...

  5. 【GUI】一、Swing外观框架BeautyEye使用

    一.Swing外观框架BeautyEye使用 1.1 导包 BeautyEye.jar 1.2 使用BeautyEye L&F public static void main(String[] ...

  6. NO-ZERO(空格补全)

    The NO-ZERO command follows the DATA statement REPORT Z_Test123_01. DATA: W_NUR(10) TYPE N. MOVE 50 ...

  7. JSON初体验(一):JsonObject解析

    在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...

  8. [Windows]_[C/C++]_[如何调试子进程]

    场景 1.VC++ 的程序A在启动程序C时, 如果需要调试程序C的话一般有两种, 一种是通过菜单 调试->附加到进程的方式来调试程序, 缺点就是这个进程必须先启动, 但是一启动的话有可能就执行了 ...

  9. 区分Oracle的数据库,实例,服务名,SID

    文章摘自:http://www.zhetao.com/content240 感谢分享O(∩_∩)O~ 在实际的开发应用中,关于Oracle数据库,经常听见有人说建立一个数据库,建立一个Instance ...

  10. ibatis常用sql

    (1) 输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" p ...