[bzoj1855][DP]股票交易

本文介绍了一个复杂的股票交易策略问题,通过动态规划的方法进行求解,实现了时间复杂度的有效降低。

Description

最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律。
通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BSi股。
另外,股票交易所还制定了两个规定。为了避免大家疯狂交易,股票交易所规定在两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔W天,也就是说如果在第i天发生了交易,那么从第i+1天到第i+W天,均不能发生交易。同时,为了避免垄断,股票交易所还规定在任何时间,一个人的手里的股票数不能超过MaxP。
在第1天之前,lxhgww手里有一大笔钱(可以认为钱的数目无限),但是没有任何股票,当然,T天以后,lxhgww想要赚到最多的钱,聪明的程序员们,你们能帮助他吗?

Input

输入数据第一行包括3个整数,分别是T,MaxP,W。
接下来T行,第i行代表第i-1天的股票走势,每行4个整数,分别表示APi,BPi,ASi,BSi。

Output

输出数据为一行,包括1个数字,表示lxhgww能赚到的最多的钱数。

Sample Input

5 2 0

2 1 1 1

2 1 1 1

3 2 1 1

4 3 1 1

5 4 1 1

Sample Output

3

HINT

对于30%的数据,0 < =W 对于50%的数据,0 < =W 对于100%的数据,0 < =W 对于所有的数据,1 < =BPi <
=APi < =1000,1 < =ASi,BSi < =MaxP

题解

n4n4的dp很显然,设f[i][j]f[i][j]表示第i天拥有j的股票的最大收益,对于p有p=[0,max(0,iW1)]p=[0,max(0,i−W−1)],有转移方程

f[i][j]=f[i1][j]f[i][j]=f[i−1][j]

f[i][j]=jASi<=k<jmax(f[p][k](jk)APi)f[i][j]=∑j−ASi<=k<jmax(f[p][k]−(j−k)∗APi)

f[i][j]=j<k<=j+BSimax(f[p][k]+(kj)BPi)f[i][j]=∑j<k<=j+BSimax(f[p][k]+(k−j)∗BPi)

考虑如何优化,此处仅考虑对于购买式,卖出式同样
即为=max(f[p][k]+kAPi)jAPi=max(f[p][k]+k∗APi)−j∗APi
由于f[p][k]f[p][k]pp单调递增的情况下单调不减
发现对于任意k都可以容易维护一个最大值f[p][k]+kAPi
复杂度降为nmaxP2n∗maxP2
又发现对于任意j,j-ASi单调递增
故可以单调队列优化
再次降为nmaxPn∗maxP
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{int APi,BPi,ASi,BSi;}a[2005];
int T,mxP,W;
int li[2005],g[2005];
int mx[2005],f[2005][2005];
bool vis[2005][2005];
/*
f[p][k]
max(l1)         max(l2)
*/
int h,t;
int main()
{
    scanf("%d%d%d",&T,&mxP,&W);
    for(int i=1;i<=T;i++)scanf("%d%d%d%d",&a[i].APi,&a[i].BPi,&a[i].ASi,&a[i].BSi);
    int p;memset(f,-63,sizeof(f));
    memset(vis,false,sizeof(vis));
    f[0][0]=0;vis[0][0]=true;
    for(int i=1;i<=T;i++)
    {
        for(int j=0;j<=mxP;j++)if(vis[i-1][j])f[i][j]=f[i-1][j],vis[i][j]=true;
        p=max(0,i-W-1);
        h=t=1;li[1]=0;
        for(int j=0;j<=mxP;j++)
        {
            while(h<t && j-a[i].ASi>li[h])h++;
            if(h<=t && j-a[i].ASi<=li[h])f[i][j]=max(f[i][j],f[p][li[h]]-(j-li[h])*a[i].APi),vis[i][j]=true;
            if(vis[p][j])
            {
                while(h<=t && f[p][j]+j*a[i].APi>f[p][li[t]]+li[t]*a[i].APi)t--;
                li[++t]=j;
            }
        }
        h=t=1;li[1]=mxP;
        for(int j=mxP;j>=0;j--)
        {
            while(h<t && li[h]>j+a[i].BSi)h++;
            if(h<=t && j+a[i].BSi>=li[h])f[i][j]=max(f[i][j],f[p][li[h]]+(li[h]-j)*a[i].BPi),vis[i][j]=true;
            if(vis[p][j])
            {
                while(h<=t && f[p][j]+j*a[i].BPi>f[p][li[t]]+li[t]*a[i].BPi)t--;
                li[++t]=j;
            }
        }
    }
    int ans=0;
    for(int i=0;i<=mxP;i++)ans=max(ans,f[T][i]);
    printf("%d\n",ans);
    return 0;
}
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声参数或引入更多传感器类型进行扩展实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值