poj1821——Fence
题意:
一个栅栏一共有n(从1——n)个木板,我们找k个工人去粉刷它,li表示每个人有限制粉刷木板数量,pi表示粉刷一个木板得到的钱,si表示他开始在那个木板前面
如果一个工人要粉刷,那么他必须粉刷si这个木板,而且工人粉刷时必须是连续的木板
题解:
dp[i][j]表示有i个人粉刷j块木板所获得的最大利润
dp[i][j]=max(max(dp[i-1][j],dp[i][j-1]),dp[i][k]+(j-k)*p(i))
dp[i-1][j]表示i-1个人粉刷j块木板所获得的最大利润
dp[i][j-1]表示i个人粉刷j-1块木板所获得的最大利润
dp[i][k]+(j-k)*p(i) 这里面的k是枚举在第i个人可以粉刷木板的数量(因为题目要求第i个人必须粉刷si这块木板,那么粉刷区间肯定也包括它)
//m是一个结构体,里面包含一个工人的li,pi,si
for(int j = m[i].s;j <= m[i].s + m[i].l - 1;j ++)
{
for(int k = j - m[i].l;k <= m[i].s - 1;k ++)
if(k >= 0)
{
dp[i][j] = max(dp[i][j],dp[i - 1][k] + (j - k) * m[i].p);
}
}
话可以利用单调队列降低复杂度
通过上面的代码我们可以看出来j越大,那么k也就随之变大,这就符合单调队列的特性,单调队列(递减队列)里面放dp[i][k]-k*p(i),为什么放这个是因为我们后面枚举j的时候
直接可以通过 (队列头)+j*p(i) 来找求最优解(这个(j*p(i))与前面的抵消了一部分,剩下的就是第i个人粉刷的部分),因为递减队列头部放的值肯定是最大的,所以
队列头部就是最好的dp转移位置,为了防止粉刷区间大于l(i),我们要每次先对单调队列中的数据进行处理
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 #include<deque>
7 using namespace std;
8 typedef long long ll;
9 const int maxn=2e5+10; //数组开到2e4都不行,
10 const int mod = 998244353;
11 const int INF=0x3f3f3f3f;
12 struct shudui
13 {
14 int l,p,s;
15 }m[maxn];
16 bool mmp(shudui x,shudui y)
17 {
18 return x.s<y.s;
19 }
20 int dp[110][maxn];
21 struct jihe
22 {
23 int k,x;
24 }str1;
25 deque<jihe>r;
26 int main()
27 {
28 int n,k;
29 scanf("%d%d",&k,&n);
30 for(int i = 1;i <= n;i ++)
31 scanf("%d%d%d",&m[i].l,&m[i].p,&m[i].s);
32 sort(m + 1,m + 1 + n,mmp); //这个要加上
33
34 for(int i=1;i<=n;++i)
35 {
36 for(int j = 1;j <= k;j ++)
37 dp[i][j] = max(dp[i - 1][j],dp[i][j - 1]);
38
39 while(r.size()) r.pop_back();
40 for(int kk = max(m[i].s - m[i].l,0);kk <= m[i].s - 1;kk ++)
41 {
42 int tmp = dp[i - 1][kk] - kk * m[i].p;
43
44 while(r.size() && r.back().x < tmp) r.pop_back();
45 str1.k=kk;
46 str1.x=tmp;
47 r.push_back(str1);
48 }
49 for(int j = m[i].s;j <= m[i].s + m[i].l - 1;j ++)
50 {
51 while(r.size() && r.front().k < j - m[i].l) r.pop_front();
52 dp[i][j] = max(dp[i][j],r.front().x + j * m[i].p);
53 }
54 }
55 int ans = 0;
56 for(int i = 1;i <= k;i ++)
57 ans = max(ans,dp[n][i]);
58 printf("%d\n",ans);
59 return 0;
60 }
poj1821——Fence的更多相关文章
- [POJ1821]Fence(单调队列优化dp)
[poj1821]Fence 有 N 块木板从左至右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次.第 i 个工匠要么不粉刷,要么粉刷包含木板 Si 的,长度不超过Li 的连续一段 ...
- POJ1821 Fence
题意 Language:Default Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6478 Accepted: ...
- poj1821 Fence【队列优化线性DP】
Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6122 Accepted: 1972 Description ...
- POJ1821 Fence 题解报告
传送门 1 题目描述 A team of $k (1 <= K <= 100) $workers should paint a fence which contains \(N (1 &l ...
- poj1821 Fence(单调队列优化dp)
地址 一排N个木板,M个工匠站在不同位置$S_i$,每个人可以粉刷覆盖他位置的.最长长度为$L_i$木板段,每刷一个有$P_i$报酬.同一木板只刷一次.求最大报酬. 根据每个人的位置dp,设$f[i] ...
- $Poj1821\ Fence\ $单调队列优化$DP$
Poj Acwing Description 有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到P ...
- poj1821 Fence(dp,单调队列优化)
题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ...
- 单调队列与DP
算是一个总结吧! 先来一个模板: TYVJ 1305 最大子序和 题目描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m ...
- Fence(poj1821)
Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4705 Accepted: 1489 Description ...
随机推荐
- 在Linux系统下限制指定目录的大小以及文件/文件夹数量
背景说明 在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配 ...
- 面试官:Netty的线程模型可不只是主从多Reactor这么简单
笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...
- Oracle Rac to Rac One Node
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2020.01.14 20:05:12 =~=~=~=~=~=~=~=~=~=~=~= [oracle@rac01 ~]$ srvc ...
- 分布式 ID 生成算法 — SnowFlake
一.概述 分布式 ID 生成算法的有很多种,Twitter 的 SnowFlake 就是其中经典的一种. SnowFlake 算法生成 ID 的结果是一个 64bit 大小的整数,它的结构如下图: 1 ...
- CS_WHERE_USED_MAT 反查BOM的成品CS15
可能很多人都用过BOM展开的函数,但是有的时候,需要通过组件去反查BOM的成品,而这时候就需要用到函数 CS_WHERE_USED_MAT来实现,而对于CS_WHERE_USED_MAT只能反查到上一 ...
- MongoDB查询优化--explain,慢日志
引入 与Mysql数据库一样,MongoDB也有自己的查询优化工具,explain和慢日志 explain shell命令格式 db.collection.explain().<method(. ...
- Java入门者:如何写出美观的Java代码?
前言 在帮助各位同学远程解决代码问题的时候,发现很多同学的代码都有一个共同问题:代码书写格式不规范.虽然代码书写规范对程序性能及运行并不影响,但影响着别人对你编程习惯或能力的第一印象,同时也会给阅读者 ...
- 解决ubuntu获取root账号并开通ssh
1.设置root密码 sudo passwd root 2.修改etc/ssh/sshd_config文件 su - root vi /etc/ssh/sshd_config LoginGraceTi ...
- PW2320芯片N沟道增强型MOSFET
PW2320采用先进的沟道技术,以提供优良的RDS(ON),低栅电荷和电压门极电压低至2.5V时工作.该装置适合用作电池保护或在其他开关应用中. 特征 VDS=20V ID=8A RDS(开)< ...
- 如何封装Promise对象?
最近看到了一个有趣的Promise的方法,这里记录下来 <script> class MyPromise { constructor(executor) { // 初始化state赋值为p ...