POJ 1821 Fence(单调队列优化DP)
题解
以前做过很多单调队列优化DP的题。
这个题有一点不同是对于有的状态可以转移,有的状态不能转移。
然后一堆边界和注意点。导致写起来就很难受。
然后状态也比较难定义。
dp[i][j]代表前i个人涂完前j个位置的最大收益。
然后转移考虑
第i个人可以不刷。dp[i][j]=dp[i-1][j];
第j个木板可以不刷dp[i][j]=dp[i][j-1];
然后当c[i].s<=j<=s[i]+l[i]-1时
dp[i][j]=p[i]*j+max(dp[i-1][k]-p[i]*k)其中j-l[i]<=k<=s[i]-1;
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int N=20000; 8 const int M=210; 9 int dp[M][N],n,m,q[N],head,tail,ans; 10 struct people{ 11 int l,p,s; 12 }c[M]; 13 bool cmp(people a,people b){ 14 return a.s<b.s; 15 } 16 int read(){ 17 int sum=0,f=1;char ch=getchar(); 18 while(ch<'0'||ch>'9'){ 19 if(ch=='-')f=-1; 20 ch=getchar(); 21 } 22 while(ch>='0'&&ch<='9'){ 23 sum=sum*10+ch-'0'; 24 ch=getchar(); 25 } 26 return sum; 27 } 28 int main(){ 29 while(scanf("%d%d",&n,&m)!=EOF){ 30 memset(dp,0,sizeof(dp)); 31 for(int i=1;i<=m;i++){ 32 c[i].l=read();c[i].p=read();c[i].s=read(); 33 } 34 sort(c+1,c+1+m,cmp); 35 for(int i=1;i<=m;i++){ 36 memset(q,0,sizeof(q)); 37 head=1;tail=1; 38 for(int j=1;j<=n;j++){ 39 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 40 if(j>=c[i].s&&j<=c[i].s+c[i].l-1){ 41 while(head<=tail&&q[head]<j-c[i].l)head++; 42 if(head>tail)continue; 43 dp[i][j]=max(c[i].p*j+dp[i-1][q[head]]-c[i].p*q[head],dp[i][j]); 44 } 45 if(j<c[i].s){ 46 while(head<=tail&&dp[i-1][j]-c[i].p*j>=dp[i-1][q[tail]]-c[i].p*q[tail])tail--; 47 q[++tail]=j; 48 } 49 } 50 } 51 printf("%d\n",dp[m][n]); 52 } 53 return 0; 54 }
转载于:https://www.cnblogs.com/Xu-daxia/p/9757131.html
POJ 1821 Fence(单调队列优化DP)相关推荐
- POJ 1821 Fence ★(单调队列优化DP)
题目大意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以 ...
- POJ - 3926 Parade(单调队列优化dp)
题目链接:点击查看 题目大意:给出一个n*m的街道,其中有(n+1)*m条街道,每条街道都有一个值,现在我们需要从最下面的任意一点出发,到达最上面的任意一点结束,问如何规划路线能让沿途经过的街道的权值 ...
- poj 1821(单调队列优化dp)
题意:有一道线性篱笆由N个连续的木板组成.有K个工人,你要叫他们给木板涂色.每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到 ...
- poj 2373(单调队列优化dp)
在长为L(<=1000000)的草地(可看成线段)上装喷水头,喷射是以这个喷水头为中心,喷水头的喷洒半径是可调节的调节范围为[a,b].要求草地的每个点被且只被一个喷水头覆盖,并且有些连续区间必 ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
题干: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但是这个游戏比较坑,里面竟然有负数,表示你要支付多少蒜币.因为这些数字都是可见的,所 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- 【单调队列优化DP】烽火传递 LibreOJ - 10180
题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...
最新文章
- Mysql探究之null与not null
- union(联合)合并查询结果
- P2756,ssl2601-飞行员配对问题【网络流24题,最大匹配,dinic】
- redis -- 学习
- 作者:李超(1988-),男,上海交通大学硕士生,主要研究方向为大数据网络。...
- java 获取 t 的类型_如何获取类型为T的字段的类?
- 正四边形单元刚度矩阵与其尺寸关系
- IP地址快速切换(转)
- h5跳转app指定页
- MATLAB编程 动态数组的创建
- 使用Arduino和Node.js实现网页界面控制LED的亮度
- 计算机上什么键有存储,计算器存储运算键是什么?
- Sock学习1 (网络基本知识、Sock简介)
- 11.	Zigbee应用程序框架开发指南 - 命令行接口(CLI)
- 100%代码覆盖率的悲剧
- 移动通信网络中的无线电通讯原理
- iphone模拟器上模拟内存警告
- PHPWord Beta 0.6.2 开发者指南
- Web services详解 :入门必看 | WSDL、SOAP
- Ubuntu18.04启用中文输入法
热门文章
- jdk,Eclipse,SWTDesigner安装【原创】
- win系统删除,已经注册的服务
- 阿里一面,说说你对Mysql死锁的理解
- java画图颜色_手绘板,多种颜色选择。我抄的《疯狂java讲义》的,包我乱导的,但代码能用。...
- python定义变量_Python基础 变量的基本使用
- 【kafka】kafka 生态系统 Ecosystem
- 【clickhouse】clickhouse UTC 时间带有时区 如何写入
- 【Elasticsearch】不常用 length filer、ngram filter、trim filter、truncate filter、unique filter、synonym token
- 【Okio】Okio 简单入门
- 【SpringCloud】Spring cloud Alibaba Nacos 集群和持久化配置