HDOJ 3401 Trade (单调队列优化)

3DGS-to-PC实战指南:零代码实现3D高斯场景到点云/Mesh的高效转换 本文详细介绍了3DGS-to-PC工具如何实现3D高斯场景到点云/Mesh的高效转换,无需代码即可完成。通过实战案例和参数调优技巧,帮助用户快速掌握这一开源插件的使用方法,提升3D数据处理效率。特别适合建筑扫描、影视特效等领域的专业人士。 阅读详情

【题意】告诉你 T 天里,物品的买卖价格,和最多买卖数量,还有 T 天里能买入最多的物品数量,每一次买卖间隔时间必须大于 w+1!

【分析】

1. dp[i][j] 表示前 i 天手里有 j 支股票时所获得的最大收益,因为要间隔 w+1 天才能进行一次买卖,所以前 w+1 天只能进行一个操作,那就是买操作。

2. 关于赋初值问题,合法的状态也有可能为负值的,而且结果要取最大值,所以非法状态要赋值为 -INFS.

3. dp[i][j] = max(dp[i-w-1][x] - (j-x)*AP, dp[i-w-1][y] + (y-j)*BP); 另外还有第 i 天什么都不做的情况此时为 dp[i][j] = max(dp[i][j], dp[i-1][j]).

4. 关于转移方程,时间复杂度是很高的,所以要采取单调队列优化,deq[],pos[] 分别放置窗口里面的最大值以及最大值所在的窗口位置。这里我用了一个结构体的队列直接维护这两个信息!

5. 如何构造单调队列里面的转移,其实很简单例如 dp[3] = max(dp[1] + 2 * v, dp[2] + 1 * v);  两边同时减去 3 * v 就可以变成一个通项公式了,偏移正好。高中数学知识。

6.推到队列优化也可以这样做,只考虑买的情况,卖的和它对称。dp[i][j] = max(dp[i-w-1][k]-j*ap[i]+k*ap[i]),移下项变成dp[i][j]+j*ap[i] = max(dp[i-w-1][k]+k*ap[i]),很明显可以把后面维护成一个递减的单调队列,每次取队首元素,使得复杂度降为O(N*P)!

【AC代码】

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2200;
const int unf = -0x3f3f3f3f;
int N,P,W,dp[maxn][maxn],ap[maxn],bp[maxn],as[maxn],bs[maxn];
//dp[i][j]代表在第i天拥有j股的最大价值
struct node{
    int val,pos;
}que[maxn];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&N,&P,&W);
        for(int i=1; i<=N; i++){
            scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
        }
        //init.
        memset(dp,unf,sizeof(dp));
        for(int i=1; i<=N; i++){
            for(int j=0; j<=min(as[i],P); j++){
                dp[i][j] = -ap[i]*j;
            }
        }
        //在第天什么也不做
        for(int i=2; i<=N; i++){
            for(int j=0; j<=P; j++){
                dp[i][j] = max(dp[i][j],dp[i-1][j]);
            }
        }
        //状态转移,维护dp[i][j]
        int head,tail,pre;
        for(int i=W+2; i<=N; i++){
            pre = i-W-1;
            head = 0,tail = -1;
            for(int j=0; j<=P; j++){//only buy
                dp[i][j] = max(dp[i][j],dp[i-1][j]);
                node temp;
                temp.val = dp[pre][j]+j*ap[i];
                temp.pos = j;
                //maintain queue.
                while(head<=tail && que[tail].val<temp.val) tail--;
                que[++tail] = temp;
                while(head<=tail &&(j-que[head].pos)>as[i]) head++;
                if(head<=tail){
                    dp[i][j] = max(dp[i][j],que[head].val-j*ap[i]);
                }
            }
            head = 0,tail = -1;
            for(int j=P; j>=0; j--){//only sell
                dp[i][j] = max(dp[i][j],dp[i-1][j]);
                node temp;
                temp.val = dp[pre][j]+j*bp[i];
                temp.pos = j;
                //maintain queue.
                while(head<=tail && que[tail].val<temp.val) tail--;
                que[++tail] = temp;
                while(head<=tail &&(que[head].pos-j)>bs[i]) head++;
                if(head<=tail){
                    dp[i][j] = max(dp[i][j],que[head].val-j*bp[i]);
                }
            }
        }
        printf("%d\n",dp[N][0]);//在最后一天卖完股票的最大值
    }
    return 0;
}


FPGA实现高效数字下变频:CORDIC与CIC滤波器的Verilog优化设计 本文深入探讨了FPGA实现高效数字下变频的技术方案,重点介绍了CORDIC算法与CIC滤波器的Verilog优化设计。通过详细的算法原理分析、FPGA实现技巧和实战经验分享,展示了如何利用CORDIC的旋转运算替代乘法操作,以及CIC滤波器在降采样中的高效性能。文章还提供了完整的系统集成方案和资源优化策略,为无线通信和雷达信号处理领域的工程师提供了实用参考。 阅读详情

相关推荐

Windows 高精度计时器:QueryPerformanceCounter 原理、陷阱与最佳实践

本文深入解析Windows高精度计时器QueryPerformanceCounter(QPC)的工作原理、常见陷阱及最佳实践。QPC通过读取硬件计时器(如TSC)实现微秒级精度,适用于游戏开发、音视频处理等高性能场景。文章详细探讨了多核同步、动态频率调整等挑战,并提供了优化代码示例和性能对比数据。

weixin_33391446的博客 271

POJ-2373 Dividing the Path 动态规划+优先队列

参考资料:icpc暑期课 题意: N 头牛在长为 L 的线段上吃草(???),每头牛活动范围(S,E),不同奶牛活动范围可以有重叠。现在需要安装喷水头,喷水头可调节,调节范围 [ A,B ],要求:线段上每个整点都恰好位于一个喷水头喷洒范围,每头奶牛的活动范围都要在一个喷水头喷洒范围内,任何喷水头喷水范围不可超过线段两端。现在求解最少安装几个喷头。  问题分析: 1. 从起点往终点安装喷水...

我曾将青春翻涌成她 也曾指尖码出盛夏 497

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 364

HDOJ 3401 Trade

单调队列优化DP : dp[ i ] [ j ] = max{ dp[ i-1 ] [ j ]  ,  dp[ i - w -1 ] [ k ] - ( j - k )*ap[ i ]  ,  dp [ i - w - 1 ] [ k ] + ( k - j )*bp[ i ]  } 后两项 dp [ i - w - 1 ][ k ] + k* xx - j * xx 且 abs( j -

码代码的猿猿 1655

Visual SLAM算法笔记

最近在学习SLAM算法,这里作为阅读笔记记录和总结一下。对经典的单目SLAM/VO算法做了摘要和总结,比如Nister VO、MonoSLAM、PTAM、ORB-SLAM、LSD-SLAM、SVO、DSO等,对几个单目和IMU的融合算法也做了简单总结,比如MSCKF、OKVIS、IMU-Preintegration等。

MulinB的技术博客 3万+

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 798

HDOJ 3401 Trade(二维DP + 单调队列优化)

题意: 告诉你 T 天里,物品的买卖价格,和最多买卖数量,还有 T 天里能买入最多的物品数量,每一次买卖间隔时间必须大于 w+1 思路: 1. dp[i][j] 表示前 i 天手里有 j 支股票时所获得的最大收益,因为要间隔 w+1 天才能进行一次买卖,所以前 w+1 天只能进行一个操作,那就是买操作。 2. 关于赋初值问题,合法的状态也有可能为负值的,而且结果要取最大值,所以非...

weixin_30436891的博客 102

真随机数与伪随机数

前面我们学习了LFSR,这个玩意落地到具体的应用是什么呢?没错是寄存器,这里在网络找到了几个回答,这里做个记录,下面一起来学习一下吧。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1062

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

Trade Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4793    Accepted Submission(s): 1617 Problem Description Recently, lxhgww is addic

Dust_heart的博客 376

【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解

SpringBoot整合LangChain4j实现RAG检索实战详解

congge 1万+

威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细)

威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细)

Robot_PLC_HMI_Automation 1万+

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

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2118    Accepted Submission(s): 665 Problem Description Recently, lxhgww is a

志当存高远 1554

时间序列—显著相关性和滞后性分析_python

本文讲述了两个时间序列(信号)的相关性分析,可以利用相关性分析进行特征筛选。此外本文还讲了怎么判断时间序列的滞后性的方法。

qq_34229228的博客 2万+

hdu3401 Trade 单调队列优化dp

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2918    Accepted Submission(s): 930 Problem Description Recently, lxhgww is addic

习惯与规则决定命运 1335

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

hdu3401 Trade 单调队列优化dp

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2918    Accepted Submission(s): 930 Problem Description Recently, l...

weixin_34216107的博客 88

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

hdu 3401 Trade

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2817    Accepted Submission(s): 890 Problem Description Recently, lxhgww is addic

记录成长的点点滴滴. . . . . 1095

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

hdu 3401 Trade dp+单调队列

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

smz436487的专栏 406

CodeForces - 91B 单调队列 或 线段树

【题意】给一个序列,从右边开始看,对于第i个数字a[i],在右边找到一个比它小(严格小)的,最靠右的位置,k,输出k-i-1,如果一个都找不到,输出-1。对于序列的每个元素都要输出。 【解题方法1】 线段树。节点保存最小值,每次把节点更新为INF,然后查找整个区间最右边比它小的数的位置。 【代码1】 int n, a[maxn]; struct node{ int l, r,

I good vegetable a! 1062

HDU 2191 二进制优化 和 单调队列优化

【题目链接】 点击打开链接 【题意】中文题目 【解法1】 暴力。拆成01背包即可。复杂度 O(n*m*m) int weight[110],value[110],cnt[110]; int dp[110]; int main() { int C; scanf("%d",&C); while(C--) { int m,n;

I good vegetable a! 942

POJ 2823 Sliding Window 单调队列优化 滑动窗口

【题意】 n个数,现在有一个大小为w的划窗,窗口每个时刻向后移动一位,求出每个时刻窗口中数字的最大值和最小值。 【解题方法】 求最大值:建立一个单调递减队列,元素从左到右依次入队,入队之前必须从队列尾部开始删除那些比当前入队元素小或者相等的元素,直到遇到一个比当前入队元素大的元素,或者队列为空为止。若此时队列的大小超过窗口值,则从队头删除元素,直到队列大小小入窗口值为止。然后把当前元素插

I good vegetable a! 895

HDU 5903 Square Distance (贪心+dp)

Square Distance Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 192    Accepted Submission(s): 61 Problem Description A string is calle

I good vegetable a! 894

POJ 2823

【题意】给定一个大小已知的数组以及一个大小已知的滑动窗口,窗口每个时刻向后移动一位,求出每个时刻窗口中数字的最大值和最小值。 【分析】第一分单调队列优化的入门题,思路很简单,这里就是维护一个长度最长为k的递增和递减的单调队列! 【AC代码】 // cpp~ //queue dp #include #include using namespace std; const int maxn =

I good vegetable a! 855

HDU 3401 Trade 单调队列优化DP

【题目链接】 点击打开链接 【题意】 大概就是说一个人现在炒股,他有两种操作,一种是买股票(这个当然是花钱), 一个是卖股票(这里钦定为挣钱)。然后每个人在每天买和卖股票的数量是有限制的,并且还有一个限制是一个人拥有的股票数不能超过MaxP。还有一个人执行操作的间隔必须大于W。问这个人最后最多挣多少钱? 【解题方法】 我们可以大胆的写出一个朴素的DP方程:

I good vegetable a! 792

POJ 1821 Fence(单调队列优化)

【题意】K个人对N块木板涂色,每个人初始站在一块木板前(不重复),每人最多只能涂包含所站木板的连续l个木板或一个木板也不涂。给出每人最多涂的木块数l,涂一快木板的工钱p,站的木板s。求这群人最多共获得多少工钱。 【分析】dp[i][j]表示前i个人对前j块木板操作的最大收益。 核心状态转移方程:dp[i][j]=max(dp[i][j-1],dp[i-1][k]+P[i].p*(j-k

I good vegetable a! 774

HDU 3706 Second My Problem First 单调队列简单题

【题目链接】点击打开链接 【题意】非常简单,题目很短,自己读一下就好。 【解题思路】 单调队列的应用,维护一个递减的长度为A的单调队列了可以了。但是这题用数组的话,会MLE,反正我是被卡MLE了。所以改用STL的deque实现,可以解决本题。 【AC代码】 // //Created by just_sort 2016/1/7 //Copyright (c) 2016 just_

I good vegetable a! 753

UESTC - 594 我要长高 单调队列优化DP

【题目链接】点击打开链接

I good vegetable a! 746
上一篇: HDOJ 3415 Max Sum of Max-K-sub-sequence
下一篇: POJ 3061 Subsequence
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值