传送门

这道题是一道很好的单调队列优化DP的例子。

题目大意是有n个工人,每个人可以粉刷一段长度不超过l[i]的墙,如果一个人粉刷了那么他必须要粉刷第s[i]块墙,一个人粉刷一块墙能得到p[i]的钱,求所有工人得到的钱的最大值。

我们首先把所有工人按s[i]排序,这样方便我们线性DP。

考虑DP,用dp[i][j]表示前i个工人刷j块的得到的钱的最大值,那么我们分类讨论,首先是一个人不刷和一块墙不刷的情况,那么就有dp[i][j] = max(dp[i-1][j],dp[i][j-1]);

之后,我们考虑这个工人刷墙的情况。因为这个人必须要刷s[i],那这个人的转移必然是从s[i] - l[i] ~ s[i]这一段转移过来的。否则的话就成了不合法情况。那么就有dp[i][j] = max{dp[i-1][k] + (j - k) * p[i]} (s[i] - l[i] <= k <= s[i])

这个式子我们朴素的做法是先枚举i,对于每一个工人i,枚举它粉刷的块数j,之后再枚举转移的范围。不过这样会超时,我们考虑优化。我们发现如果把j,k分离出来,那么对于每一个j(状态),它对应的j * p[i]是一个定值,只有内部的式子随着k(决策)的变化而改变,而且其实对于每一个j,有很大一部分的可选取的决策区间是重复的。

说到这里,我们就想到用单调队列维护啦!!那么我们的想法就是,对于每一个工人,我们首先把s[i] - l[i] ~ s[i]这一段区间之内的所有决策压入单调队列,之后随着j的增加,所能选取的k的区间左端点随之变大。也就是说实际上,我们只要维护一段左端点变大,右端点不动的区间最大值就可以了。

所以一般来说,单调队列优化DP的套路就是,如果一个DP方程能被拆成每一个状态都是从一个决策区间中选取最优的转移,然后决策区间随着状态变化左右端点变化,而且有大量重复,我们就可以先拆分式子,拆成内层只与决策有关,这样直接用单调队列维护决策的极值,就省去了一层循环,优化了时间。

看一下代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 10005;
const int INF = 1000000009;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}struct worker
{int l,p,s;bool operator < (const worker &g) const{return s < g.s;}
}a[105];int n,k,dp[105][20005],q[20005],head,tail;int calc(int i,int x)
{return dp[i-1][x] - x * a[i].p;
}int main()
{n = read(),k = read();rep(i,1,k) a[i].l = read(),a[i].p = read(),a[i].s = read();sort(a+1,a+1+k);rep(i,1,k){head = 1,tail = 0;rep(j,max(0,a[i].s-a[i].l),a[i].s-1){while(head <= tail && calc(i,q[tail]) < calc(i,j)) tail--;q[++tail] = j;}rep(j,1,n){dp[i][j] = max(dp[i-1][j],dp[i][j-1]);if(j >= a[i].s){while(head <= tail && q[head] < j - a[i].l) head++;if(head <= tail) dp[i][j] = max(dp[i][j],calc(i,q[head]) + j * a[i].p);}}}printf("%d\n",dp[k][n]);return 0;
}

转载于:https://www.cnblogs.com/captain1/p/9929440.html

POJ1821 Fence相关推荐

  1. 【POJ1821】Fence

    单调队列优化dp 我们将每个人的s值排序,这样我们就能保证当前这个人刷的木板一定在上一个人之后,我们就能进行线型dp 定义f[i][j]表示前i个人刷前j个木板获得的最多报仇,那么有 第i个人不工作, ...

  2. 运维企业专题(10)RHCS集群工具——FENCE搭建、高可用服务配置详解

    前言:FENCE工具的原理及作用 FENCE设备是RHCS集群中必不可少的一个组成部分,通过FENCE设备可以避免因出现不可预知的情况而造成的"脑裂"现象,FENCE设备的出现,就 ...

  3. Docker fence

    docker的fence是通过docker服务端的api来关闭container的. 目前fence docker还没有加到epel库中, 所以在centos或rhel中使用, 需要从src编译. w ...

  4. CFCC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence

    http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...

  5. TZOJ 2569 Wooden Fence(凸包求周长)

    描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...

  6. [BZOJ1724][Usaco2006 Nov]Fence Repair 切割木板

    1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1272  Solved: ...

  7. Linux的企业-Mfs高可用corosync+pacemaker+fence+iscci

    一.配置环境 Redhat6.5 Server1:172.25.50.1 master corosync+pacemaker Server2:172.25.50.2 master corosync+p ...

  8. 276. Paint Fence

    题目: There is a fence with n posts, each post can be painted with one of the k colors. You have to pa ...

  9. 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops

    P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...

最新文章

  1. 第五章Bookstrap
  2. mac os系统使用Visual Studio Code打开浏览器查看HTML文件
  3. 发福利了|最近发现深圳有一家公司提供的叫8ms的GUI平台不错,好用,最主要所有功能都是免费的
  4. Spring mvc注解方式使用事务回滚
  5. [渝粤教育] 四川大学 药用植物学 参考 资料
  6. 先对齐再融合,Salesforce Research提出ALBEF,用动量蒸馏进行多模态表示学习!多个下游任务性能SOTA!...
  7. 微信公众号开发之授权获取用户信息
  8. 【Linux】Linux的常用远程工具
  9. 深入浅出学Spring Data JPA
  10. Ecliplse安装tomcat插件
  11. 与postman的第一次亲密接触
  12. 最长公共子序列问题解析
  13. Android之四大组件、六大布局、五大存储
  14. SQL往表里添加字段
  15. windows10中最强大王爽汇编语言学习环境
  16. 南京大学俞扬教授:强化学习真实环境不好用?那就模拟器来凑!
  17. 使用ffmpeg从视频中提取纯音频纯视频
  18. 移动通信客户价值数据挖掘分析实战
  19. 2021年美容师(初级)免费试题及美容师(初级)模拟试题
  20. 基于反射实现的一个观察者模板

热门文章

  1. Adobe PhotoShop(PS) for Mac 如何隐藏切片框?
  2. Linux 命令之 chmod -- 改变文件或目录权限
  3. HH SaaS电商系统的商品关联版式功能模块设计
  4. js如何获取jwt信息_谈房地产公众号如何涨粉?一篇文章让你轻松获取信息
  5. html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...
  6. python中自带的模块_python中的模块详解
  7. 账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...
  8. java反向映射_opencv 直方图和直方图反向映射
  9. mysql数据库改成支持中文_修改Mysql编码支持中文
  10. mysql 安装盒子_Windows2008 装 MySQL 问题