正题

题目链接:https://www.luogu.com.cn/problem/P4852


题目大意

给出n,m,c,dn,m,c,dn,m,c,d,有n∗c+mn*c+mn∗c+m张卡牌。进行nnn次连抽mmm次单抽,连抽连续ccc张卡牌会获得第一张卡牌的欧气值,单抽可以获得抽到卡牌的欧气值。不能连续进行ddd次单抽,求最大欧气值之和。


解题思路

定义fi,jf_{i,j}fi,j​表示进行iii次连抽之后抽到了第jjj张卡牌的最大欧气值。

因为一定是先进行若干次单抽(可以为0)再进行一次连抽。所以我们先用单调队列转移单抽也就是fi,j=max{fi−1,k+sum(k+1,j)}(j−d≤k≤j)f_{i,j}=max\{f_{i-1,k}+sum(k+1,j)\}(j-d\leq k\leq j)fi,j​=max{fi−1,k​+sum(k+1,j)}(j−d≤k≤j)
然后转移连抽fi,j=fi,j−c+aj−c+1f_{i,j}=f_{i,j-c}+a_{j-c+1}fi,j​=fi,j−c​+aj−c+1​(注意因为不能连续多抽所以要倒着转移)

然后转移的时候记录方案就好了,时间复杂度O(mcn2)O(mcn^2)O(mcn2)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2e5+10;
int n,m,c,d,a[N];
int f[45][N],g[45][N];
deque<int> q;
void Write(int dep,int x){if(!dep)return;Write(dep-1,g[dep][x]);printf("%d ",x-c+1);
}
int main()
{scanf("%d%d%d%d",&n,&m,&c,&d);for(int i=1;i<=c*n+m;i++){scanf("%d",&a[i]);a[i]+=a[i-1];}memset(f,0xcf,sizeof(f));f[0][0]=0;for(int i=1;i<=n+1;i++){while(!q.empty())q.pop_back();for(int j=(i-1)*c;j<=c*n+m;j++){while(!q.empty()&&f[i-1][q.back()]-a[q.back()]<f[i-1][j]-a[j])q.pop_back();q.push_back(j);while(!q.empty()&&q.front()<j-d)q.pop_front();f[i][j]=f[i-1][q.front()]+a[j]-a[q.front()];g[i][j]=q.front();}if(i!=n+1){for(int j=c*n+m;j>=c;j--){f[i][j]=f[i][j-c]+a[j-c+1]-a[j-c];g[i][j]=g[i][j-c];}for(int j=0;j<c;j++)f[i][j]=-2147483647/3;}}printf("%d\n",f[n+1][c*n+m]);Write(n,g[n+1][c*n+m]);
}

P4852-yyf hates choukapai【单调队列优化dp】相关推荐

  1. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  2. poj 2373(单调队列优化dp)

    在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...

  3. poj 1821(单调队列优化dp)

    题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...

  4. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  5. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)

    题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...

  6. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  7. POJ 1821 Fence(单调队列优化DP)

    题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...

  8. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

  9. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

  10. 【单调队列优化dp】jzoj4883灵知的太阳信仰 纪中集训提高B组

    [NOIP2016提高A组集训第12场11.10]灵知的太阳信仰 (File IO): input:array.in output:array.out Time Limits: 1000 ms Mem ...

最新文章

  1. 一周焦点 | Dota2团战击溃AI;不如跳舞!伯克利最新人体动作迁移研究
  2. linux 笔记--while循环、函数和进程管理
  3. 多图 | 搞懂volatile和synchronized的区别
  4. java安装 环境配置
  5. python操作excel之 模块 xlrd
  6. MATLAB基本操作(五):MATLAB中的逻辑运算及all(),any()的使用
  7. 远程连接MySQL数据库失败
  8. 金融系列白皮书 |《金融业线上渠道转型的方法与实践》上线
  9. 【JQuery】on/off 绑定事件和解绑事件
  10. Vim文本编辑器 指令大全(二)
  11. TensorFlow 教程 --进阶指南--3.1总览
  12. Java关键字:final,static,this,super
  13. ASP.NET MVC 1.0 + spring.net 1.2.0.20288 + NHibernate 2.0.1.4000整合笔记(四)——整合asp.net mvc...
  14. 剑指offer七:两个链表的第一个公共结点
  15. 阿里云文本检测 使用教程(Java)
  16. diybox路由器设置教程_图文教程:家用无线路由器设置 | 192路由网
  17. i.MX6ULL终结者屏幕背光调节例程程序设计
  18. 这世上本来没有路,走的人多了,也便成了路
  19. python 权限认证 impala_python操作具有kerberos认证的hive(impala)
  20. 智能优化算法之遗传算法python实现细节,GA库函数调用方法

热门文章

  1. java十六进制大小端转换_字节顺序
  2. java mongodb 批量删除_MONGODB删除/新增/更改大量记录的方法
  3. hotelling t2 matlab,pca主成份分析方法
  4. javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...
  5. .net 读蓝牙数据_Linux内核曝严重蓝牙漏洞,影响多个版本
  6. 如何把python文件发给别人没_如何把自己写的python程序给别人用
  7. C++中判断在字符串中是否存在空格 以及 如何输入带空格的字符串
  8. [RabbitMQ]创建Java开发环境_消费者_生产者
  9. [蓝桥杯][算法提高VIP]聪明的美食家-dp
  10. 洛谷 P1706 P1036 -小试牛刀