Poj   Acwing

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 ;
}

随机推荐

  1. day5-python之递归与二分法

    一.递归的定义 递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用 二.递归分为两个阶段:递推,回溯 age(5) = age(4) + 2 age(4) = ag ...

  2. laravel 5 自定义全局函数,怎么弄呢?

    在app/Helpers/(目录可以自己随便来) 下新建一个文件 functions.php 在functions.php 中加入这个方法 然后在 bootstrap/autoload.php 中添加 ...

  3. ListOfOpenSourcePrograms

    ListOfOpenSourcePrograms Contents Desktop Applications Communication Engineering Educational Financi ...

  4. 2018-10-20-WPF-通过位处理合并图片

    title author date CreateTime categories WPF 通过位处理合并图片 lindexi 2018-10-20 16:53:49 +0800 2018-10-20 1 ...

  5. eclipse maven项目导出所使用的jar包

    在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...

  6. 解决某些手机RadioGroup中的RadioButton不居中(右移)问题

    最近一直在忙一个项目,页面的基本框架类似于QQ那样,有底部导航栏的,遂采用的是RadioButton来实现的.本来一直在我的模拟器上测试,页面展示是没啥问题的,效果图如下: 可是,坑爹的事今天却发生了 ...

  7. Python--day24--继承面试题

    输出:(打印的是Dog.func而不是Animal.func) __init__方法如果本生的类具有的话,父类的__init__方法就不在调用,没有才调用父类的__init__方法 派生属性: 如果既 ...

  8. Spring与C3p0连接数据库对事务操作

    maven包: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodin ...

  9. 2019-4-10-win10-uwp-自定义标记扩展

    title author date CreateTime categories win10 uwp 自定义标记扩展 lindexi 2019-04-10 09:46:13 +0800 2019-04- ...

  10. java的四种代码块

    用{}括起来的称为代码块: 普通代码块:类中方法的方法体 构造代码块:类中{}直接括起来的语句,每次创建对象都会被调用,先于构造函数执行 静态代码块:类中static{}括起来的语句,只执行一次,先于 ...