$Poj1821\ Fence\ $单调队列优化$DP$
Description
有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到Pi的报酬.求如何安排能使工匠们获得的总报酬最多.
1<=N<=16000,1<=M<=100
Sol
先把所有工匠按照Si从小到大排序,使我们能够按顺序进行线性Dp.
设$F[i][j]$表示前i个工匠粉刷前j块木板的最大报酬(包含空着不刷的木板).转移分为三种情况:
1.第i个工匠啥也不干 $F[i][j]=F[i-1][j]$
2.第j块木板空着不刷 $F[i][j]=F[i][j-1]$
3.第i个木匠刷k+1到j块木板 $F[i][j]=max(F[i-1][k]+Pi*(j-k)) (j-Li<=k<=Si-1,j>=Si)$
然后用单调队列优化第3个式子
$F[i][j]=Pi*j+max(F[i-1][k]-Pi*k)$ 单调队列维护$max(F[i-1][k]-Pi*k)$就OK了
单调队列维护时元素的进出序列要弄清楚是队首还是队尾,不要搞混了 (大概也只有我会搞混 $ovo$
Code
#include<iostream>
#include<cstdio>
#include<deque>
#include<algorithm>
#define il inline
#define Rg register
#define fr front
#define bk back
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i++)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,m,f[][];
deque<int>q;
struct node{int l,p,s;}a[];
il int cal(int i,int x){return f[i-][x]-a[i].p*x;}
il bool cmp(node x,node y){return x.s<y.s;}
int main()
{
n=read(),m=read();
go(i,,m)a[i]=(node){read(),read(),read()};
sort(a+,a+m+,cmp);
go(i,,m)
{
q.clear();
go(k,max(a[i].s-a[i].l,),a[i].s-)
{
while(q.size() && cal(i,q.bk())<=cal(i,k))q.pop_back();
q.push_back(k);
}
go(j,,n)
{
f[i][j]=max(f[i][j-],f[i-][j]);
if(j>=a[i].s)
{
while(q.size() && q.fr()<j-a[i].l)q.pop_front();
if(q.size())f[i][j]=max(f[i][j],a[i].p*j+cal(i,q.fr()));
}
}
}
printf("%d\n",f[m][n]);
return ;
}
随机推荐
- oracle函数 current_date
[功能]:返回当前会话时区中的当前日期 [参数]:没有参数,没有括号 [返回]:日期 [示例]select current_date from dual; 返回:2008-11-14
- H3C 用交换机扩展以太网拓扑
- python yield 和 return 对比分析
相同点:都是返回函数执行的结果 不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值 例子 ...
- 在SuperSocket中启用TLS/SSL传输层加密
关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS ...
- 前端开发工具之jQuery
jQuery jQuery是一个轻量级的JavaScript第三方库,能够简单方便的进行JavaScript编程. jQuery选择器 1,id选择器: $("#id") 2,标签 ...
- svcs (service status) 和 svcadm (service administration) 使用
1. svcs 显示服务实例的状态信息 svcs - report service status 显示服务状态命令 DESCRIPTION The svcs command displays in ...
- H3C 配置Basic NAT
- jstack简介
jstack:Java进程中线程的堆栈信息跟踪工具 功能简介 jstack常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的 ...
- D3.js力导向图(适用于其他类型图)中后添加元素遮盖已有元素的问题解决
上一篇说了在D3.js中动态增加节点及连线的一种实现方式,但是有后添加元素遮盖原节点的现象,这一篇说一下出现这个现象的解决办法. 在D3.js中后添加的元素是会遮盖先添加的元素的,同时还有一个设定:后 ...
- <数论相关>欧几里得与拓展欧几里得证明及应用
欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...