【DP+单调队列】 hdu3401 Trade

hdu 3401 Trade 单调队列优化dp 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目意思: 一个人开始有无穷多的钱,问买股票最多能赚多少钱。 要求: 每天买卖的股票数量有限制bl和sl,交易的时间间隔必须超过w+1天。 最多持有的数量为p股。 解题思路: dp[i][j]表示前i天当持有j股股票时,获得的最大利益。 状态转移: 当第i天不交易时为d 阅读详情

Trade
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3401
题意:知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最多能赚多少钱。开始时有无限本金,要求任两次交易需要间隔W天以上,即第i天交易,第i+w+1天才能再交易。同时他任意时刻最多只能拥有maxp的股票,
题解:容易写出DP方程  dp[i][j]=max{dp[i-1][j],max{dp[r][k]-APi[i]*(j-k)}(0<r<i-w,k<j),max{dp[r][k]+BPi[i]*(k-j)}(0<r<i-w,k>j)} 分别是第i天不交易,买股票和卖股票3种转移。
第一眼看会发现这个方程十分冗杂,没有下手的地方。我们可以分析下,对于买卖股票的转移中的dp[r][k]中的r是否有枚举的价值,注意dp[i][j]中取最大时会考虑dp[i-1][j]的值,也就是dp[i-w-1][k]>=dp[r][k](0<r<i-w)恒成立。这样就省去了r 的枚举,但这还不够。以买股票为例,我们可以化简max{dp[i-w-1][k]-APi[i]*(j-k)}(k<j)},即dp[i-w-1][k]-APi[i]*(j-k)=dp[i-w-1][k]+APi[i]*k-APi[i]*j(k<j),可以发现对于确定的i和j只要取符合条件中最大的dp[i-w-1][k]+APi[i]*k即可,这个可以通过单调队列实现。

代码:

#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 2005
#define inf 0xfffff
#define max(a,b) ((a)>(b)?(a):(b))
int T,MaxP,W;
int APi[MAX],BPi[MAX],ASi[MAX],BSi[MAX];
int dp[MAX][MAX];//dp[i][j]第i天持有j股的最大值
//dp[i][j]=max{dp[i-1][j],max{dp[r][k]-APi[i]*(j-k)}(0<r<i-w,k<j),max{dp[r][k]+BPi[i]*(k-j)}(0<r<i-w,k>j)}
struct node
{
    int x;//存dp[i-w-1][k]+APi[i]*k或dp[i-w-1][k]+BPi[i]*k
    int p;//当前持股数
} q[2005],temp;
int front,back;
int main()
{
    int cas;
    scanf("%d",&cas);
    for(; cas--;)
    {
        scanf("%d%d%d",&T,&MaxP,&W);
        for(int i=1; i<=T; ++i)
            scanf("%d%d%d%d",APi+i,BPi+i,ASi+i,BSi+i);
        for(int i=0; i<=T; ++i)
            for(int j=0; j<=MaxP; ++j)
                dp[i][j]=-inf;
        for(int i=1; i<=W+1; ++i)
            for(int j=0; j<=ASi[i]; ++j)
                dp[i][j]=(-APi[i]*j);
        for(int i=2; i<=T; ++i)
        {
            for(int j=0; j<=MaxP; ++j)
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
            if(i<=W+1) continue;
            //买入
            front=back=1;
            for(int j=0; j<=MaxP; ++j)
            {
                temp.p=j;
                temp.x=dp[i-W-1][j]+APi[i]*j;
                for(;front<back&&q[back-1].x<temp.x;--back);
                q[back++]=temp;
                for(;front<back&&q[front].p+ASi[i]<j;++front);
                dp[i][j]=max(dp[i][j],q[front].x-APi[i]*j);
            }
            //卖出
            front=back=1;
            for(int j=MaxP; j>=0; --j)
            {
                temp.p=j;
                temp.x=dp[i-W-1][j]+BPi[i]*j;
                for(;front<back&&q[back-1].x<temp.x;--back);
                q[back++]=temp;
                for(;front<back&&q[front].p-BSi[i]>j;++front);
                dp[i][j]=max(dp[i][j],q[front].x-BPi[i]*j);
            }
        }
        int ans=0;
        for(int i=0;i<=MaxP;++i)
            ans=max(ans,dp[T][i]);
        printf("%d\n",ans);
    }
    return 0;
}

来源: http://blog.youkuaiyun.com/acm_ted/article/details/7909742

Hdu3401 Trade(dp 单调队列优化)最详细题解 注:本题代码已经贴在ubuntu pastebin上代码地址是 http://paste.ubuntu.com/24522455/题目地址是http://acm.hdu.edu.cn/showproblem.php?pid=3401Problem DescriptionRecently, lxhgww is addicted to stock, he finds some regular patte 阅读详情

相关推荐

HDU 3401 Trade(用单调队列优化DP)

题目链接:点击打开链接 题意:给出T天内,每天的股票买卖价格和每天的股票买卖最大数量,而且每天最多只能拥有maxP数量的股票,开始时有无限本金,任意两次交易需要间隔W天及以上,也就是第i天交易,第i+w+1天及以后才能再交易。问最多能赚多少钱? 思路:很明显的DP问题,用dp[i][j]表示第i天拥有j数量股票时的最多赚钱数。容易得到状态转移方程: (1)当天不买不卖: dp[i][j

不忘初心 600

HDU3401 Trade(单调队列优化DP)

最近做CF的时候遇到单调队列优化DP的问题,看了一下网上这种题也很少,而且都很难理解,下面是两个解释的比较好的博客: 单调队列优化DP的基本思路:点击打开链接 两道例题详解:点击打开链接 下面讲一下我自己对单调队列优化dp的理解,首先不是所有dp都可以使用单调队列优化的,只有形如 dp[i]=max/min (f[k]) + g[i] (k<i &...

weixin_34217773的博客 192

别再折腾框架了!用华为应用市场官方渠道搞定GBOX,安全安装谷歌全家桶(鸿蒙HarmonyOS 3/4实测)

本文详细介绍了如何在鸿蒙系统上通过华为应用市场官方渠道安全安装GBOX,实现谷歌全家桶的无损使用。该方法避免了传统破解方式的安全风险,利用沙箱技术隔离运行环境,确保系统稳定性和数据安全。特别适合鸿蒙HarmonyOS 3/4用户安全使用谷歌生态应用。

weixin_29305313的博客 4795

hdu 3401(单调队列优化dp)

传送门 题解: 构造状态dp[i][j]表示第i 天拥有 j只股票的时候,赚了多少钱 从前一天不买不卖 dp[i][j]=max(dp[i-1][j],dp[i][j]) 从前i-W-1天买进一些股 dp[i][j]=max(dp[i-W-1][k]-(j-k)*AP[i],dp[i][j]) 从i-W-1天卖掉一些股 dp[i][j]=max(dp[i-W-1][k]+(k-j)*BP[

KGV093的博客 483

如何在huggingface上申请下载使用llama2/3模型

huggingface-cli download --resume-download 模型名称 --local-dir 存放模型的位置 --local-dir-use-symlinks False --resume-download --token token序列号xxxxxxx。登录huggingface,在模型详情页面上,找到这个表单,填写内容,提交申请。需要使用梯子,country填写梯子的位置吧(比如美国)等待一小时左右,会有邮件通知。

a61022706的博客 1万+

大象机器人myAGV移动机器人+mechArm六轴机械臂,开源复合机器人开发与实践!

我们这章节的内容是将协作性机械臂打破距离上的限制,跟移动机器人(myAGV)相连接,实现一个案例。

m0_71627844的博客 1488

HDU-3401-Trade-dp-单调队列优化

HDU-3401-Trade-dp-单调队列优化 【Description】 Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study. He forecasts the next T days' stock market. On the i'th d...

Simon的博客,已转移至 https://www.cnblogs.com/--Simon/ 539

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 290

HDU-3401:Trade(dp+单调队列优化)

HDU-3401:Trade DP+单调队列优化

污miao汪的博客 650

Altium Designer学习---如何进行SI仿真

Altium designer 如何进行SI仿真。         1、仿真电路中需要至少一块集成电路;             2、器件的IBIS模型;              3、在规则中必须设定电源网络和地网络;              4、建立SI规则约束;              5、层堆栈必须设置正确,电源平面必须连续;     建立的文件必须是一个工程,并把相应的文件放在工程目...

weixin_34050519的博客 4903

042、双管反激的电压应力优势

【摘要】本文通过300W工业电源炸管案例,对比分析了单管与双管反激拓扑的电压应力差异。单管反激因漏感能量难以处理,尖峰电压可达1180V,需依赖RCD吸收电路但效率低下;双管反激通过钳位二极管将漏极电压限制在输入电压水平(实测650V),能量回馈使效率提升2-3%。虽增加两个MOS管,但可选用600V器件(单管需1200V),总成本反降15%以上。作者建议150W以上或高压输入场景优先采用双管反激,其确定的电压应力可显著提升可靠性,避免单管反激的参数玄学问题。关键设计要点包括快恢复二极管选型、紧凑布局及漏感

Jack010169的博客 83

hdu 3401 单调队列优化动态规划

思路: 动态方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]); dp[i][j]表示第i天拥有j个石头的最大价值。 其实每次求得都是最有策略,所有dp[i-w-1]表示的就是i-w-1以前的最优,故不同往前遍历。 那么主要需要优化的是: 对于买石头,容量为j时,维护从j-k到j的转移最大...

weixin_30647065的博客 91

20、超声多普勒成像技术全解析

本文全面解析了超声多普勒成像技术,涵盖彩色血流成像(CFI)、能量多普勒成像、超快多普勒成像和矢量多普勒成像的原理、流程、优势及临床应用场景。详细探讨了各成像模式的特点,如CFI的血流方向与速度可视化、能量多普勒对小血管的高灵敏度、超快多普勒的高帧率分析能力,以及矢量多普勒消除角度依赖性的创新方法。同时分析了技术面临的挑战及未来发展趋势,包括更高分辨率、人工智能辅助诊断和便携式设备的发展,为医学影像研究和临床诊断提供重要参考。

z2a3b4c5d的博客 279

单调队列优化DP Hdu3401-Trade

题目

wuzy38的博客 298

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

孤独的单刀 1626

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

hdu 3401 Trade dp+单调队列优化

hdu 3401 Trade 题意 lxhgww一共有T天,最多只能持有MaxP股票,每两次买股票和卖股票间隔W天。第i天能够买Asi[i]数量的股票,能够卖Bsi[i]数量的股票,买股票每张Api[i],卖股票每张Bpi[i]。最初手中没有股票,但是有足够的钱,问最多能赚多少钱。 分析 dp+单调队列 dp[i][j]表示第i天,拥有j张股票能赚的最多钱。 则我们可以由题意得出三组动态转移方程...

weixin_43894796的博客 218

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

单调队列优化的DP HDU3401 Trade

单调队列优化的DP 单调队列整理链接 动态规划,我们经常会遇到转移的过程需要和前面(L,L+m)(L,L+m)(L,L+m)的区间转移的操作 若每次只需要(L,L+m)(L,L+m)(L,L+m)的最大或最小值 mmm的大小固定 那么我们就可以用单调队列来取(L,L+m)(L,L+m)(L,L+m)的最值来优化动态规划 HDU3401 Trade 题意 X某预知了接下来TTT天的某只股票情况 ...

qcwlmqy的博客 180

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【HDU 3401 Trade】 单调队列优化dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目大意:现在要你去炒股,给你每天的开盘价值,每股买入价值为ap,卖出价值为bp,每天最多买as股,最多卖出bs股,并且要求两次买卖必须间隔W天,问你在T天内如何进行炒股操作从而获得最大收益。 解题思路:先吐槽一下,会单调队列但不会dp不行,会dp但不会单调队列也不行!!开始...

baidui8622的博客 178

HDU 3401 Trade dp 单调队列优化

戳这里:3401 题意:给出第i 天的股票买卖价格(APi,BPi),以及每天股票买卖的数量上限(ASi,BSi),要求任两次交易需要间隔 W 天以上,即第 i 天交易,第 i + W + 1 天才能再交易,求最多能赚多少钱 思路:dp[i][j] = max(dp[i - 1][j], max(dp[f][k] - (j - k) * APi[i]), max(dp[f][k] ...

diufeng0879的博客 159

HDU 3401 Trade 【DP+单调队列优化】

题意 给出接下来T天每天卖出、买入股票的价格,每天买入、卖出的上限,持有的股票的总上限,并且两次股票操作之间有时间间隔,求T天之后最多能赚多少钱。 分析 很容易可以写出状态转移方程: dp[i][j]↔第i天持有j的股票能获得的最大利益 dp[i][j]=max(dp[i−1][j],max(dp[pre][j+k]+BP[i]∗k),max(dp[pre]...

babao9492的博客 197

单调队列 例子:hdu3401 trade(dp加单调队列)

单调队列指的是指队列中的元素是单调的。如:{a1,a2,a3,a4……an}满足a1<=a2<=a3……<=an,a序列便是单调递增序列。同理递减队列也是存在的。单调队列出现的机会不多,而且最常和dp一起出现。单调队列是一种工具而不是解题的方法。 单调队列的出现可以简化问题,队首元素便是最大(小)值,这样,选取最大(小)值的复杂度便为o(1),由于队列的性质,每个元素入队一次,出队一次,维护队列

Kblacksmith的博客 1461

hdu 3401 Trade(单调队列优化DP)

题目链接:hdu 3401 Trade 题解转自 【DP+单调队列】 hdu3401 Trade 题意: 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最多能赚多少钱。开始时有无限本金,要求任两次交易需要间隔W天以上,即第i天交易,第i+w+1天才能再交易。同时他任意时刻最多只能拥有maxp的股票,题解: 容易写出DP方程 dp[i][...

weixin_30809333的博客 162

【单调队列维护DP】HDU 3401 Trade

Trade Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6208Accepted Submission(s): 2154 Problem Description Recently, lxhgww is addicted ...

qq_41037114的博客 168
上一篇: 【DP+单调队列】 hdu3415 Max Sum of Max-K-sub-sequence
下一篇: 【DP+斜率优化】 hdu2993 MAX Average Problem
ACM_Ted
博客等级 码龄15年 122粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值