$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 ;
}
随机推荐
- ArcGIS中的连接和关联表
大多数数据库的设计指导方针都倾向于将数据库组织成多个表 - 每个表关注一个特定的主题 - 而非一个包含所有必要字段的大型表.设置多个表可以避免数据库中的信息发生重复,因为只会将信息在一个表中存储一次. ...
- @bzoj - 4380@ [POI2015] Myjnie
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 n 家洗车店从左往右排成一排,每家店都有一个正整数价格 p[ ...
- 模块化Vs组件化
模块化&组件化 原因 图解 模块化Module 概念 使用 目的 依赖 架构定位 内容:组件内的Script 组件化 概念 使用 目的:复用,解耦 依赖 架构定位 内容:template.st ...
- 用CSS画平行四边形
<div class="jx">我是一个平行四边形</div> <style> .jx{ //定义div的高度宽度 transform:skew ...
- js 制作分页
如图所示 在html中调用方法 getpage(7, 1, 1, 'URL') 1.page.js文件 代码 function getpage(count, countPage, pageIndex, ...
- HDU 6623"Minimal Power of Prime"(数学)
传送门 •题意 给你一个大于 1 的正整数 n: 它可以分解成不同的质因子的幂的乘积的形式,问这些质因子的幂中,最小的幂是多少. •题解 定义 $ans$ 表示最终答案: ①如果 $ans \ge 5 ...
- java异常处理格式
异常处理的5个关键字 try ,catch, finally throw, throws 我的总结: 捕获异常:先捕获小异常再捕获大异常. 程序是调出来的,不是写出来的:多测试是程序员的必修课. ...
- 如何用for..of.. 遍历一个普通的对象?
如何用for..of.. 遍历一个普通的对象? 首先了解一下for..of..: 它是es6新增的一个遍历方法,但只限于迭代器(iterator), 所以普通的对象用for..of遍历 是会报错的.下 ...
- Django入门总结
- 2019-9-2-C#命令行解析工具
title author date CreateTime categories C#命令行解析工具 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...