【题解】Fence(单调队列)

POJ - 1821

题目大意

有\(k\)个粉刷匠,每个粉刷匠一定要粉刷某个位置\(S_i\),一个粉刷匠可以粉刷至多\(l_i\)个位置(必须连续\(l_i\)互不相同),一个粉刷匠粉刷一个位置要收\(p_i\)元,问怎么安排可以使得粉刷匠赚的钱最大。

\(dp(i,j)\)考虑了前\(i\)个人,考虑了前\(j\)个位置的最大值,转移是这样的:

\[dp(i,j)=\max\{\max\{dp(i-1,k)+(j-k)\times p_i\},dp(i-1,j),dp(i,j-1)\},k\in[j-l_i,s_i)
\]

按照讨论把第二个\(\max\)变一下

\[max\{dp(i-1,k)+(j-k)\times p_i\}=\max\{dp(i-1,k)-kp_i\}+jp_i
\]

现在问题就变成如何维护\(\max\{dp(i-1,k)-kp_i\}\)

单调队列就好了。注意一些细节:

  • \(\max\{dp(i-1,j),dp(i,j-1)\}\) 要在转移完毕后继承。
  • \(k\in [j-l_i,s_i)\)
  • \(dp(0,\forall x)=dp(\forall x,0)=0\)(初始化)

目标:\(dp(k,n)\)。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue> using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1.6e4+5;
struct NODE{
int l,p,s;
NODE(){l=p=s=0;}
inline void scan(){l=qr();p=qr();s=qr();}
inline bool operator <(const NODE&a)const{return s<a.s;}
}data[101];
int dp[101][maxn];
int n,k;
deque < int > q;
int main(){
n=qr();k=qr();
memset(dp,0xcc,sizeof dp);
memset(dp[0],0,sizeof dp[0]);
for(register int t=1;t<=k;++t)
data[t].scan(),dp[t][0]=0;
sort(data+1,data+k+1);
for(register int t=1;t<=k;++t){
q.clear();q.push_back(0);
for(register int i=1;i<data[t].s;++i){
while(q.size()&&q.back()+data[t].l<data[t].s) q.pop_back();
while(q.size()&&(dp[t-1][q.front()]-q.front()*data[t].p<=dp[t-1][i]-i*data[t].p)) q.pop_front();
q.push_front(i);
}
for(register int i=data[t].s;i<=min(n,data[t].s+data[t].l-1);++i){
while(q.size()&&q.back()+data[t].l<i) q.pop_back();
if(q.size()) dp[t][i]=max(dp[t][i],dp[t-1][q.back()]+(i-q.back())*data[t].p);
}
for(register int i=1;i<=n;++i)
dp[t][i]=max(dp[t][i],max(dp[t-1][i],dp[t][i-1]));
}
cout<<dp[k][n]<<endl;
return 0;
}

【题解】Fence(单调队列)的更多相关文章

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

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

  2. Sliding Window - 题解【单调队列】

    题面: An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving fr ...

  3. poj 1821 Fence 单调队列优化dp

    /* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...

  4. poj1821 Fence(单调队列优化dp)

    地址 一排N个木板,M个工匠站在不同位置$S_i$,每个人可以粉刷覆盖他位置的.最长长度为$L_i$木板段,每刷一个有$P_i$报酬.同一木板只刷一次.求最大报酬. 根据每个人的位置dp,设$f[i] ...

  5. [题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形

    调了半天,发现这个写法确实极易错...... 对于每列都维护一个单调队列记录最大最小值,这样一次操作后就把最大最小值压到了一维, 然后再对这一行维护一个单调队列,每次更新ans值,然而对于数组和队列下 ...

  6. HDU 5945 题解(DP)(单调队列)

    题面: Fxx and game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) T ...

  7. $Poj1821\ Fence\ $单调队列优化$DP$

    Poj   Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...

  8. 【NOIP2017】跳房子 题解(单调队列优化线性DP)

    前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...

  9. P1725 琪露诺 题解(单调队列)

    题目链接 琪露诺 解题思路 单调队列优化的\(dp\). 状态转移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考虑单调队列优化. ...

随机推荐

  1. (持续集成)win7上部署Jenkins+MSBuild+Svn+SonarQube+SonarQube Scanner for MSBuild (第二发)

    这一篇进入实战,走起.... 登录jenkins,如下图 点击上图中的“新建”按钮,进入下图 输入项目名称,选择“构建一个自由风格的软件项目”即可,点击“ok”,跳转到下图 svn源代码管理(选择代码 ...

  2. linux grep 搜索查找

    查找关键字在哪些文件夹中的哪些文件中出现(只列出文件名称): grep -l 15386257298 */* 查找关键字在哪些文件夹中的哪些文件中出现(列出文件名称+关键字): grep -o 153 ...

  3. Inno Setup打包的安装程序在Vista/Win7上自动提示需要管理员权限的方法

    来源:http://hi.baidu.com/jingrensoft/blog/item/c34575cfae4fb926f9dc617f.html 首先,在 [Setup]段 PrivilegesR ...

  4. autolayout先进的自动布局工具箱

    原文链接:http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html 在我的上一个项目中,因为是面向公司内部使用的客户端,所以我直接抛弃了 ...

  5. Oracle 11gR2 RAC 单网卡 转 双网卡绑定 配置步骤

    之前写过一篇双网卡绑定的文章,如下: Oracle RAC 与 网卡绑定 http://blog.csdn.net/tianlesoftware/article/details/6189639 Ora ...

  6. openTK学习

    简介 the Open Tool Kit (OpenTK), 是对 OpenGL.OpenAL.OpenCL 的跨平台的封装,使用 C# 编写,它可以用在Mono.dotNet的语言:c#.VB.C+ ...

  7. SEO误区之——静态化页面

    你随便去找一个做SEO的人或者一个公司,他百分之百会让你把网页弄成纯静态页面,然后告诉你这样对搜索引擎是如何如何地好,那么我告诉你,这个做 SEO的,肯定不专业. 网页静态化这个东西,纯属以讹传讹的事 ...

  8. java中的占位符\t\n\r\f

    \t 相当于tab,缩进\n NewLine 换行 System.out.println("aaa\tbbb"); //aaa bbbSystem.out.println(&quo ...

  9. python 制作wordcloud词云

    pip install wordcloud 需要用到numpy  pillow matplotlib 安装完成以后 wordcloud_cli --text in.txt --imagefile ou ...

  10. 2016.11.29 activiti实战--第19章--统一身份管理(含自定义用户与数组的实现)

    学习资料:<Activiti实战> 第十九章 统一身份管理 本章讲解如何统一业务系统与activiti的用户管理系统. 第5章的时候已经讲解过activiti的用户与组.一般来说业务系统都 ...